string.format 本身不直接支持本地化自动切换,但可通过显式传入 locale 参数实现数字、日期、货币等格式的本地化控制;不同地区的小数点、千分位、百分号位置等依 locale 而异;日期需配合 t 转换符及 locale;货币推荐用 numberformat 而非硬编码符号。

String.format 本身不直接支持本地化(Locale)的自动切换,但可以通过显式传入 Locale 参数来实现数字、日期、货币等格式的本地化控制。
指定 Locale 控制数字和百分比格式
不同地区对小数点、千位分隔符、百分号位置等有不同习惯。Java 的 String.format 支持在第一个参数传入 Locale 实例:
- 中文环境(如中国大陆):`String.format(Locale.CHINA, "%.2f", 1234.567)` → `"1234.57"`(使用英文句点,无千分位)
- 德国环境:`String.format(Locale.GERMAN, "%.2f", 1234.567)` → `"1234,57"`(小数点为逗号)
- 法国环境:`String.format(Locale.FRANCE, "%,d", 1234567)` → `"1 234 567"`(空格作千分位)
日期格式化需配合 SimpleDateFormat 或 DateTimeFormatter
String.format 对日期的支持有限(仅 `t` 转换符),且本地化效果依赖传入的 Locale:
- `String.format(Locale.JAPAN, "%tF %ta", new Date())` → `"2024-06-15 土"`(年月日 + 星期简写)
- `String.format(Locale.US, "%tB %te, %tY", new Date())` → `"June 15, 2024"`
- 注意:
t系列转换符不能单独用 `Locale` 控制时区,时区需额外通过日历或 `ZonedDateTime` 处理
货币符号与数值格式需组合使用 NumberFormat
String.format 不直接渲染货币符号(如 ¥、€),但可借助 NumberFormat 预格式化数值再拼接:
- 推荐方式:`NumberFormat.getCurrencyInstance(Locale.JAPAN).format(1234.5)` → `"¥1,235"`
- 若坚持用
String.format:先获取符号 `Currency.getInstance(Locale.JAPAN).getSymbol()`,再手动拼接,但易出错且不处理舍入逻辑 - 避免写成 `String.format(Locale.JAPAN, "%,d ¥", 1234)` —— 这里 `¥` 是硬编码,未随 Locale 动态变化
最佳实践建议
- 始终显式传入
Locale,不要依赖 JVM 默认(`Locale.getDefault()` 可能被修改) - 对复杂格式(尤其含多语言文本+数字+单位),优先用
MessageFormat+ResourceBundle - Android 开发中注意:`String.format` 在低版本可能忽略 Locale,建议用 `Resources.getString(int, Object...)` 配合 `values-zh/strings.xml`
- 服务端应用建议统一设置线程级 Locale(如 Spring 的 `LocaleContextHolder`),再封装安全的 format 工具方法











