用string.format("%05d", 123)可左补零得"00123",但仅适用于数字类型;对字符串需用"0".repeat(math.max(0, targetlen - s.length())) + s(java 11+)或stringutils.leftpad(java 8)。

String.format 怎么写才能左补零
直接用 String.format("%05d", 123),就能得到 "00123"。关键在格式符里的 0 和宽度数字:第一个 0 表示用零填充,5 表示总宽至少 5 位,不足就左补零。
但注意——这只能对数字类型(int、long 等)生效。如果你传的是 String,比如 String.format("%05s", "123"),结果是 " 123"(空格填充),不是零。
-
%05d:只接受整数,123→"00123";传"123"会抛IllegalFormatConversionException -
%05s:接受任意对象,但填充字符固定为空格,0在这里被忽略,实际等价于%5s - 想对字符串左补零?得换方法,不能硬套
%0Ns
字符串左补零该用什么方法
对 String 补零,String.format 不行,得靠手动拼接或工具类。最轻量、无依赖的做法是用 String.repeat(Java 11+):
String s = "123"; int targetLen = 5; String padded = "0".repeat(Math.max(0, targetLen - s.length())) + s;
如果还在用 Java 8,可以用 StringUtils.leftPad(Apache Commons Lang),但得加依赖;或者自己写个循环拼接,别用 += 在大循环里反复拼,性能差。
立即学习“Java免费学习笔记(深入)”;
- 别写
for (int i = 0; i ,字符串不可变,每次 <code>+=都新建对象 - 用
StringBuilder更稳妥:new StringBuilder().repeat("0", n).append(s).toString()(Java 11+)或手写循环 append -
String.repeat是 JDK 原生 API,语义清晰,推荐优先用
补零时长度比原字符串还短会怎样
不会报错,也不会截断——String.format("%03d", 12345) 输出 "12345","0".repeat(-2) 返回空字符串。所有补零逻辑都只在“不够长”时触发,够长就原样返回。
-
String.format("%02d", 5)→"05";String.format("%02d", 55)→"55" -
"0".repeat(Math.max(0, 2 - "55".length()))→"0".repeat(0)→"" - 所以不用提前判断长度,直接算差值再取
Math.max(0, ...)就行
为什么不用 DecimalFormat 做字符串补零
DecimalFormat 看起来能干这事,比如 new DecimalFormat("00000").format(123) 得到 "00123",但它本质是数值格式化工具,有隐藏风险:
- 遇到负数会带负号:
format(-123)→"-0123",左侧补的是负号+零,不是纯零 - 对大数或科学计数法敏感,
format(1234567890123L)可能变成"1234567890123"或触发指数形式,取决于模式 - 它不接受字符串输入,必须转成数字,而字符串可能含前导零(如 ID "00123")——转数字再格式化会丢失原始零
所以,除非你确定输入全是正整数且不关心前导零语义,否则别用 DecimalFormat 替代字符串补零逻辑。
真正容易被忽略的点是:补零操作的前提是「你知道目标长度」,而这个长度常常来自配置或协议约定。一旦长度动态变化,又没做边界检查(比如 targetLen 小于 0),repeat 会静默返回空串,后续逻辑可能出错——建议在关键路径上加个 if (targetLen 。










