%s适用于任意对象(含null),%d仅限整数类型,%f仅限浮点类型;选错会抛illegalformatconversionexception或导致npe;需注意locale影响及%%转义。

String.format 里 %s %d %f 到底怎么选
选错占位符会导致运行时异常或输出错乱,比如把字符串用 %d 格式化会抛 IllegalFormatConversionException;把整数用 %f 格式化会补 .0,但若传 null 还是直接 NPE。
-
%s:万能兜底,任何对象都可用(调用toString()),包括null(输出字符串 "null") -
%d:仅接受byte/short/int/long及其包装类,BigInteger也行;float或String传进来就炸 -
%f:只认浮点数(float/double/BigDecimal),整数会被隐式转成double,但精度可能出人意料(比如1变成1.000000)
带精度和宽度的格式写法容易漏掉冒号或括号
Java 的 String.format 不支持 Python 那种 {:.2f} 写法,所有修饰必须塞进一个 % 符号里,漏掉任意字符都会让整个格式串失效,报 UnknownFormatConversionException。
- 小数点后两位:
%.2f(不是%f.2,也不是%f:.2) - 至少占 8 个字符,左对齐,不足补空格:
%-8s(-表示左对齐,没它默认右对齐) - 整数至少显示 5 位,不足前面补 0:
%05d(0是填充符,5是最小宽度) - 十六进制小写带前缀:
%#x→0xff;大写:%#X→0xFF
中文环境下 Locale 不设好,千分位和小数点会乱套
默认用系统 Locale,国内机器通常是 zh_CN,但 String.format 实际依赖的是 JVM 启动时的默认 Locale。如果服务器是英文环境,%,d 可能输出 1,234,但在某些 Android 设备上却变成 1.234(用点作千分位),导致解析失败。
- 显式指定 Locale 最稳:
String.format(Locale.US, "%,d", 1234567) - 不要依赖
Locale.getDefault(),尤其在跨平台或容器部署时 -
%,f同样受 Locale 影响,Locale.US下是3.141593,Locale.GERMAN下是3,141593
format 里的转义和嵌套占位符经常写错
% 本身是转义符,想输出字面量 % 必须写成 %%;而像 %n 是平台换行符(\r\n 或 \n),不是 \n 字符本身,这点容易混淆。
立即学习“Java免费学习笔记(深入)”;
- 输出字符串 "Progress: 50%":写成
"Progress: %d%%",少一个%就报错 - 要拼接两个动态值,别写
"%s %s".format(a, b)——String没这个方法,得用String.format("%s %s", a, b) - 占位符数量必须和参数数量严格一致,多一个少一个都抛
MissingFormatArgumentException或TooManyArgumentsException
最常被忽略的是 Locale 和 null 处理:传 null 给 %s 安全,但给 %d 或 %f 就崩;而线上环境的 Locale 往往和本地开发不一致,一到生产就格式错乱。










