DecimalFormat格式化数字不符合预期,为何出现单引号分隔?
为什么我的DecimalFormat用逗号分隔模式却输出了撇号?
嘿,这个问题我之前踩过坑!核心原因其实很简单:你在DecimalFormat模式里写的,并不是直接输出逗号,而是一个「分组分隔符标记」,实际输出的符号会由当前JVM的默认Locale(区域设置)决定。
比如有些欧洲地区(像瑞士、德国部分区域)的Locale会用撇号'作为千位分隔符,如果你的JVM默认Locale正好是这类地区,那即使你写了,###的模式,最终输出的分隔符也会变成撇号,这就是你看到123'456'789的原因。
另外先提一句:你的原代码还有个小问题——format是实例变量,但main是静态方法,直接调用会编译报错,我在下面的示例里已经修正了这个问题。
解决方案有两种,选哪种看你的需求:
方案1:指定固定Locale,强制用逗号作为分隔符
直接让DecimalFormat使用像Locale.US这类明确用逗号做千位分隔符的区域设置,这样不管JVM默认Locale是什么,输出都会是逗号:
import java.text.DecimalFormat; import java.util.Locale; public class NumberFormatter { // 用US Locale初始化DecimalFormat,确保分隔符是逗号 private static final DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(Locale.US); public static void main(String[] args) { int number; try { number = Integer.parseInt(args[0]); } catch (NumberFormatException ex) { System.out.println("The provided value was invalid!"); System.exit(0); return; } format.applyPattern("#,###,###.##"); String formattedNumber = format.format(number); System.out.println(formattedNumber); // 现在会输出123,456,789 System.exit(0); } }
方案2:手动设置分组分隔符
如果你不想依赖Locale,也可以直接修改DecimalFormat的符号配置,强制把分组分隔符设为逗号:
import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; public class NumberFormatter { private static final DecimalFormat format = new DecimalFormat(); public static void main(String[] args) { int number; try { number = Integer.parseInt(args[0]); } catch (NumberFormatException ex) { System.out.println("The provided value was invalid!"); System.exit(0); return; } // 获取符号配置实例,手动设置分组分隔符为逗号 DecimalFormatSymbols symbols = format.getDecimalFormatSymbols(); symbols.setGroupingSeparator(','); format.setDecimalFormatSymbols(symbols); format.applyPattern("#,###,###.##"); String formattedNumber = format.format(number); System.out.println(formattedNumber); // 输出123,456,789 System.exit(0); } }
另外补充:原代码里return format.format(number);在main方法里是无效的,因为main是void返回类型,我在示例里改成了输出格式化后的结果,你可以根据自己的需求调整(比如返回给其他方法或者直接输出)。
内容的提问来源于stack exchange,提问作者Andre_601
相关产品推荐
相关产品推荐

