decimalformat 专精数字本地化与高精度控制,适合货币、百分比等严格格式场景;string.format 通用简洁,适合混合文本的轻量拼接。

DecimalFormat 和 String.format 各有适用场景:前者专精于数字的本地化、高精度格式控制(如货币、百分比、固定小数位);后者更通用,适合混合文本与数字的简洁拼接,语法类似 C 的 printf。
用 DecimalFormat 精确控制数字外观
适合需要严格对齐、千分位、前导零、科学计数或适配不同 Locale 的场合。它基于模式字符串(pattern),不依赖参数顺序,可复用。
- 基础模式示例:"#,##0.00" 表示带千分位、保留两位小数(不足补零),如 1234.5 → "1,234.50"
- 百分比模式:"0.00%" 会自动将数值 ×100 并加 % 符号,0.123 → "12.30%"
- 前导零与整数位控制:"000.000" 强制显示三位整数+三位小数,7.5 → "007.500"
- 支持多段模式(正/负/零):"0.00;−0.00;0.00" 分别定义正数、负数、零的格式
- 设置 Locale 可切换分隔符:
new DecimalFormat("#,##0.00", new DecimalFormatSymbols(Locale.GERMAN))会用逗号作小数点、空格作千分位
用 String.format 做轻量级文本插值
适合日志、提示语、SQL 拼接等需混排字符串与变量的场景。语法统一、线程安全、无需实例化对象。
- 基本用法:
String.format("价格:%,.2f 元,数量:%d", 1234.5, 8)→ "价格:1,234.50 元,数量:8" - 常用转换符:
%d(整数)、%f(浮点)、%s(字符串)、%,d(带千分位整数)、%.2f(保留两位小数) - 宽度与对齐:
%10s左补空格至 10 字符宽,%-10s左对齐,%05d整数不足 5 位时前补 0 - 支持参数索引重用:
String.format("%1$s 是 %2$d 岁,%1$s 很健康", "张三", 30)避免重复传参
选哪个?关键看需求重心
- 只要快速拼个带数字的提示语 → 用 String.format,简单直接
- 要显示货币、百分比、适配多语言、或反复格式化同类数字 → 用 DecimalFormat,更可控、更专业
- 需要线程安全且高频调用 DecimalFormat → 缓存实例(它不是线程安全的,别在多线程里共享未同步的 formatter)
- 处理金额等敏感数据 → 别用 float/double 做原始输入,优先转成 BigDecimal 再交给 DecimalFormat
一个小陷阱提醒
String.format 的 %.2f 默认四舍五入,但用的是“银行家舍入法”(HALF_EVEN),即 0.5 向偶数舍入:String.format("%.0f", 2.5) 得 "2",String.format("%.0f", 3.5) 得 "4"。如果业务要求传统四舍五入,应先用 BigDecimal 显式指定 RoundingMode.HALF_UP,再格式化。











