java中printf对齐靠格式符的对齐标志:%-10s左对齐、%10d右对齐;字符串只能空格填充,数字可用0补位;中文因字符宽度与显示宽度不一致会导致视觉错位,无内置修复方案。

printf 里怎么让字符串左对齐或右对齐
Java 的 System.out.printf 默认右对齐数字、左对齐字符串,但实际输出常需要统一方向。对齐靠的是格式说明符里的宽度和对齐标志,不是靠空格拼接。
关键在 % 后加 -(左对齐)或不加(默认右对齐),再跟最小字段宽度。比如 %-10s 表示至少占 10 字符、左对齐;%10d 表示至少占 10 字符、右对齐整数。
-
%-8s:字符串左对齐,总宽至少 8,不足补空格(右边) -
%12.2f:浮点数右对齐,总宽至少 12,小数点后保留 2 位 -
%06d:整数右对齐,总宽至少 6,不足时左边补0(注意:0是填充符,不是对齐标志) - 如果内容超宽(比如字符串长于指定宽度),
printf不会截断,而是原样输出——对齐只控制“最小宽度”
数字补零和字符串补空格的区别在哪
补零(0)只对数字类型有效,且仅作用于**数值部分左侧**;字符串永远用空格填充,加 0 会被忽略。
常见错误是写 %010s 想让字符串前面补零——没用,0 在字符串格式中被当成普通空格处理。真正生效的只有 -(左对齐)、 (空格前缀,用于正数显 + 号)、+(强制显示符号)这些标志。
立即学习“Java免费学习笔记(深入)”;
-
%08d→00012345(8 位宽,左补零) -
%08s→ 等价于%8s,仍是右对齐、空格填充 -
%-08s→0被忽略,实际就是%-8s - 想让字符串前面补零?只能手动拼接或用
String.format配合String.join或repeat(Java 11+)
中文字符对齐错位怎么办
因为 printf 按「字符数」而非「显示宽度」计算字段长度,而一个中文字符占 2 个等宽字体位置,但算作 1 个 Java 字符。结果就是:设 %10s,放进去 "姓名"(2 字符),它只占 2 字符宽,但 printf 认为还有 8 字符空余,全用空格填满——视觉上严重右偏。
没有内置办法修复,这是终端字体与 Java 字符模型不匹配导致的。能做的只有回避或妥协:
- 避免混排中英文对齐(比如表格列头全是中文,数据也尽量用中文单位)
- 用固定宽度字体(如
Monaco、Fira Code)跑程序,部分缓解但不根治 - 真要精确控制,改用
StringBuilder手动计算字节数或用第三方库(如commons-text的StrSubstitutor) - 日志或调试输出可接受错位,生产报表类场景建议导出为 CSV / HTML,别硬扛终端对齐
printf 和 String.format 用哪个更稳妥
行为完全一致,System.out.printf 底层调的就是 String.format,只是前者直接输出到 stdout。
区别只在使用场景:需要立刻打印就用 printf;需要构造字符串再做后续处理(比如加前缀、拼 JSON、写入文件)就必须用 String.format。
- 不要在循环里反复调
printf输出大量行——I/O 开销比拼好字符串再一次性println高 -
printf不抛异常,格式错误(如参数类型不匹配)会导致IllegalFormatConversionException运行时报错,且堆栈指向printf调用行,排查比编译期检查更晚 - 如果参数可能为
null,%s会输出"null"字符串,不会 NPE;但%d遇到null直接炸,得先判空










