在 Java 中,为数字或字符串补零(即在左侧或右侧添加零以达到指定位数)是一个非常常见的操作,主要有以下几种方法,适用于不同的场景。

使用 String.format() (最推荐,最灵活)
这是最常用、最灵活的方法,类似于 C 语言的 printf,它不仅可以补零,还可以进行格式化输出。
为整数补零
使用 %0Nd 格式说明符,N 是你想要的总位数。
int number = 123;
int width = 5; // 总位数
// 左侧补零,总长度为5
String formattedNumber = String.format("%0" + width + "d", number);
System.out.println(formattedNumber); // 输出: 00123
// 如果数字本身的位数已经超过指定的宽度,则返回原数字
int bigNumber = 123456;
System.out.println(String.format("%05d", bigNumber)); // 输出: 123456
简洁写法 (Java 8+):
可以使用 String.format 的静态导入,让代码更简洁。
import static java.lang.String.format;
// ...
int number = 123;
System.out.println(format("%05d", number)); // 输出: 00123
为长整型补零
方法与整数完全相同,只是将格式说明符改为 %0Nd,并将变量改为 long 类型。

long longNumber = 987L;
System.out.println(String.format("%08d", longNumber)); // 输出: 00000987
为浮点数补零
使用 %0N.Mf 格式说明符,N 是总宽度,M 是小数点后的位数。
double doubleNumber = 3.14159;
// 总宽度为8,小数点后保留2位,左侧补零
System.out.println(String.format("%08.2f", doubleNumber)); // 输出: 00003.14
为字符串补零(左侧)
字符串补零需要一些技巧,通常使用 String.format 结合 s 说明符,并指定宽度。
String text = "abc";
int width = 6;
// 左侧补空格,达到指定宽度
System.out.println(String.format("%6s", text)); // 输出: " abc"
// 左侧补零,需要先替换空格
String paddedText = String.format("%" + width + "s", text).replace(' ', '0');
System.out.println(paddedText); // 输出: "000abc"
为字符串补零(右侧)
右侧补零同样可以使用 String.format。
String text = "abc";
int width = 6;
// 右侧补空格
System.out.println(String.format("%-" + width + "s", text)); // 输出: "abc "
// 右侧补零
String paddedText = String.format("%-" + width + "s", text).replace(' ', '0');
System.out.println(paddedText); // 输出: "abc000"
使用 DecimalFormat (专门用于数字格式化)
java.text.DecimalFormat 是专门用于格式化数字的类,功能强大,尤其适合处理复杂的数字格式(如千位分隔符)。
为整数补零
创建一个模式字符串,在 或 0 前面加 0。
- 表示可有可无的数字,如果该位置没有数字则不显示。
0: 表示必须有的数字,如果该位置没有数字则补零。
import java.text.DecimalFormat;
int number = 123;
DecimalFormat df = new DecimalFormat("00000"); // 总长度为5
System.out.println(df.format(number)); // 输出: 00123
// 如果数字位数超过模式长度,会返回原数字
int bigNumber = 123456;
System.out.println(new DecimalFormat("00000").format(bigNumber)); // 输出: 123456
为浮点数补零
模式可以包含小数点和逗号。
import java.text.DecimalFormat;
double number = 3.14159;
DecimalFormat df = new DecimalFormat("000.00"); // 总宽度6,小数点后2位
System.out.println(df.format(number)); // 输出: 003.14
// 处理小数位不足的情况
double smallNumber = 5.1;
System.out.println(df.format(smallNumber)); // 输出: 005.10
使用 StringUtils (来自 Apache Commons Lang / Spring)
如果你已经在项目中使用了 Apache Commons Lang 或 Spring 框架,它们提供了非常方便的工具类。
Apache Commons Lang - StringUtils.leftPad()
这个方法非常直观,专门用于在字符串左侧填充指定字符。
// 需要引入依赖: org.apache.commons:commons-lang3 import org.apache.commons.lang3.StringUtils; int number = 123; String strNumber = String.valueOf(number); // 左侧补零,总长度为5 String padded = StringUtils.leftPad(strNumber, 5, '0'); System.out.println(padded); // 输出: 00123 // 如果字符串长度已经超过指定长度,则返回原字符串 String longStr = "123456"; System.out.println(StringUtils.leftPad(longStr, 5, '0')); // 输出: 123456
Spring Framework - StringUtils.leftPad()
Spring Core 也有自己的 StringUtils,用法与 Apache 的类似。
// 需要引入依赖: org.springframework:spring-core import org.springframework.util.StringUtils; int number = 123; String padded = StringUtils.leftPad(String.valueOf(number), 5, '0'); System.out.println(padded); // 输出: 00123
手动实现 (不推荐,仅用于学习)
对于简单的场景,你也可以手动拼接字符串,但这种方法代码冗长且容易出错,不推荐在生产环境中使用。
int number = 123;
int width = 5;
String numStr = Integer.toString(number);
StringBuilder sb = new StringBuilder();
// 计算需要补零的个数
int zerosToAdd = width - numStr.length();
if (zerosToAdd > 0) {
for (int i = 0; i < zerosToAdd; i++) {
sb.append('0');
}
}
sb.append(numStr);
System.out.println(sb.toString()); // 输出: 00123
总结与选择建议
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
String.format() |
通用,强烈推荐 | 简洁、灵活,支持所有基本数据类型,是 Java 标准库的一部分。 | 字符串补零需要额外 replace 步骤,略显繁琐。 |
DecimalFormat |
专门用于数字格式化 | 功能强大,特别适合处理货币、百分比、千位分隔符等复杂场景。 | 仅限数字类型,API 相对 format 稍显复杂。 |
StringUtils.leftPad() |
已使用相关框架时 | 代码最直观,可读性极高,专为字符串左侧填充设计。 | 需要引入第三方库(Apache Commons Lang 或 Spring)。 |
| 手动实现 | 学习或极简单场景 | 无需依赖外部库。 | 代码冗长、效率低、容易出错,不推荐使用。 |
- 日常开发:首选
String.format(),它是标准库的一部分,功能足够强大且使用方便。 - 复杂的数字格式化(如货币、千位分隔符):使用
DecimalFormat。 - 项目已依赖 Apache Commons Lang 或 Spring:直接使用
StringUtils.leftPad(),代码更清晰。
