Java格式化数字首选DecimalFormat或String.format:前者适合精细控制符号、分组、本地化及省略尾零;后者简洁易读,适用于日志与模板输出。

Java里格式化数字,关键在选对工具、写对模式。DecimalFormat适合需要灵活控制符号、分组、本地化或去除尾随零的场景;String.format则胜在简洁、统一、易读,尤其适合日志、模板输出和快速调试。
DecimalFormat:精细控制数字外观
它通过模式字符串定义规则,支持千位分隔符、正负号样式、前缀后缀,还能自动省略无意义的小数零。
- 基础模式如
"#,##0.00"表示带千分位、强制保留两位小数(1234.5 → "1,234.50");"#.#"表示最多一位小数且不补零(3.0 → "3",3.7 → "3.7") - 处理负数与货币:用分号分隔正负子模式,例如
"$#,##0.00;($#,##0.00)",负数自动加括号并带美元符号 - 避免科学计数法:用
"#.#####"类模式可强制十进制显示,不触发e记法 - 注意线程安全:DecimalFormat不是线程安全的,多线程环境建议每次新建实例,或用ThreadLocal缓存
String.format:一行搞定,语义清晰
语法类似C的printf,靠格式说明符(%开头)控制输出,适合嵌入字符串模板或批量生成日志。
- 常用浮点格式:
"%.2f"固定保留两位小数并四舍五入(123.456 → "123.46");"%,.2f"自动加本地化千位分隔符(美式下1234567.89 → "1,234,567.89") - 整数与精度控制:
"%05d"表示至少5位,不足左补0(42 → "00042");"%8.2f"表示总宽至少8字符、小数占2位(右对齐,空格填充) - 拼接混合内容很自然:例如
String.format("用户ID: %d, 余额: %.2f 元", userId, balance) - 百分比输出需双%转义:
"%d%%"→ "90%"
怎么选?看这三点
不需要本地化、只要简单四舍五入 → 用String.format;要隐藏末尾零、自定义货币符号、或适配多语言 → 用DecimalFormat;涉及金额/金融计算 → 建议先用BigDecimal运算,再用DecimalFormat格式化输出。
- 想输出
"¥1,234.5":DecimalFormat配合自定义符号更稳妥 - 想让
5.0显示为"5"而非"5.00":DecimalFormat的"0.##"模式是首选 - 避免float精度陷阱:float本身精度有限,格式化前建议先转double或用BigDecimal计算,否则
String.format("%.2f", 123456.6755f)可能输出"123456.67"
小技巧:去掉多余小数零
String.format默认补零("%.2f"把5.0变成"5.00"),若要动态省略,可用DecimalFormat("0.##");不推荐用正则替换字符串,高频场景下性能差且易出错。

















