能,但前提是num为非负整数;对负数输出如"-07",超三位不截断;传入非数字类型会抛异常;需预处理null、字符串、浮点数等非法输入。

String.format("%03d", num) 能不能直接补零到三位?
能,但前提是 num 是非负整数。这个写法本身没问题,%03d 表示“用 0 填充、最小宽度为 3、按十进制整数格式化”,对 0、5、42、123 都有效,输出分别是 "000"、"005"、"042"、"123"。
但要注意:如果 num 是负数(比如 -7),结果是 "-07" —— 符号占一位,补零只在数字部分生效,总宽仍是 3;如果 num 超过三位(如 1234),不会截断,而是原样输出 "1234"。
为什么有时补零失败?常见错误场景
实际出问题往往不是格式符写错,而是传入了非 int/long 类型:
-
String.format("%03d", "12")→ 抛IllegalFormatConversionException:"12"是String,而%d要求整数类型 -
String.format("%03d", null)→ 抛NullPointerException -
String.format("%03d", 3.14)→ 抛IllegalFormatConversionException:double不兼容%d - 用了
%03s却期望数字补零 → 输出是字符串右对齐、左补空格,不是补零
替代方案:当需要严格三位且容错更强时
如果业务要求“必须输出恰好三位、负数也补零(如 -7 → "007")”或要处理 null/非数字,String.format 就不够用了。这时推荐:
立即学习“Java免费学习笔记(深入)”;
- 先做类型转换和校验:
int n = Objects.requireNonNullElse(num, 0),再取绝对值Math.abs(n) % 1000(保证不超三位) - 用
String.format("%03d", Math.abs(n) % 1000)得到纯数字补零结果 - 或者更稳妥地用
DecimalFormat:new DecimalFormat("000").format(n),它对负数默认输出"-007",但可配合setMinimumIntegerDigits(3)和预处理控制
性能与兼容性提醒
String.format 是通用 API,有格式解析开销,高频调用(如循环内)建议缓存 DecimalFormat 实例或用 StringBuilder 手动拼接:
int n = Math.abs(num) % 1000; String s = (n < 10) ? "00" + n : (n < 100) ? "0" + n : String.valueOf(n);
这种写法无对象分配、无异常风险,适合极致性能场景。但注意:它不处理负数符号逻辑,需前置判断是否需要丢弃符号。
真正容易被忽略的是边界行为——比如数据库里读出的 Integer 可能为 null,前端传来的字符串可能含空格或逗号,这些都得在调用 String.format 前清理干净,否则崩得毫无征兆。


















