DecimalFormat 是 Java 中用于数字格式化的类,支持自定义模式实现百分比、货币等效果;需正确设置 pattern 和 Locale,注意线程不安全、符号须为 ASCII、负数需分号定义等细节。

DecimalFormat 是 Java 中用于格式化数字的常用类,它支持自定义模式字符串,能轻松实现百分比、货币、千位分隔、小数位数控制等效果。关键在于正确设置模式(pattern)和关联对应的 Locale(影响货币符号、小数点、分组符等)。
用 DecimalFormat 输出百分比(如 0.123 → "12.3%")
百分比格式本质是将数字 ×100 后加 "%" 符号。DecimalFormat 使用 % 模式字符自动完成该转换:
- 模式
"0.0%":表示保留一位小数的百分比,0.123 → "12.3%";0.005 → "0.5%" - 模式
"##.##%":最少显示整数部分,小数部分最多两位,不补零(如 0.8 → "80%",0.007 → "0.7%") - 注意:传入的是小数形式(如 0.123),不是百分数(如 12.3)。若误传 12.3,会变成 "1230%"
用 DecimalFormat 输出货币(如 1234.56 → "¥1,234.56")
直接用 "¤#,##0.00" 模式可输出本地货币符号(¤ 是货币占位符),但更推荐结合 NumberFormat.getCurrencyInstance() —— 它内部就用了 DecimalFormat,且自动适配 Locale:
- 中文环境:
NumberFormat.getCurrencyInstance(Locale.CHINA).format(1234.56)→ "¥1,234.56" - 美国环境:
NumberFormat.getCurrencyInstance(Locale.US).format(1234.56)→ "$1,234.56" - 若坚持用 DecimalFormat:先获取对应 Locale 的 Currency 实例,再设置到 DecimalFormat(需调用
setCurrency()),否则 ¤ 可能显示为 $ 或空
自定义模式的关键规则与常见写法
DecimalFormat 模式由特殊符号组成,理解含义才能灵活组合:
-
0:必须显示的数字位,不足补零(如"00.00"格式化 3.5 → "03.50") -
#:可选数字位,不补零(如"#.##"格式化 3.5 → "3.5",3.0 → "3") -
,:千位分隔符(是否显示取决于 Locale 和模式中是否包含) -
.:小数点(位置决定小数位数) -
%:数值 ×100 并追加 % 符号 -
¤:货币符号(实际显示依赖 setCurrency() 或 Locale) - 单引号
':用于转义普通字符,如"'¥'#,##0.00"强制显示 ¥ 符号(不依赖 Locale)
注意事项与避坑提示
实际使用中容易忽略几个细节:
- DecimalFormat 不是线程安全的,多线程环境下应避免共享实例,或每次新建、或用 ThreadLocal 封装
- 模式中不能混用全角符号(如“.”或“,”),必须用 ASCII 的
.和, - 对负数,默认显示为 "-123.45";如需括号格式(如 "(123.45)"),需用模式
"(#,##0.00);(#,##0.00)"(分号前正数,后负数) - 如果数字超出模式能表示的范围(如整数位太多),不会报错,但可能截断或科学计数——确保模式宽度足够

















