String.format("%,.2f", val)不传Locale参数时,真实使用的是JVM的默认Locale——这篇真实对比美国、德国、法国三种Locale下同一个数字的格式化结果,并验证格式化后的字符串能不能直接解析回去。
上一篇:HashMap并发扩容真实验证
本机JVM默认Locale是en_CN(混合地区设置),真实对比不传Locale、US、GERMANY、FRANCE四种情况的输出。
StringFormatLocaleDemo.java double val = 1234567.891; String.format("%,.2f", val); // 不传Locale,用默认 String.format(Locale.US, "%,.2f", val); String.format(Locale.GERMANY, "%,.2f", val);
真实默认Locale: en_CN
默认Locale下 String.format("%,.2f", val) 真实结果: 1,234,567.89
Locale.US 下真实结果: 1,234,567.89
Locale.GERMANY 下真实结果: 1.234.567,89
Locale.FRANCE 下真实结果: 1 234 567,89
真实结果证明三种Locale给出了三种完全不同的数字表示——美国和法国的千分位符号不同(逗号 vs 空格),德国更是把千分位和小数点的符号直接对调了(句号做千分位、逗号做小数点)。本机默认Locale是en_CN(语言英语、地区中国的混合设置),真实格式化结果恰好和US一致,但这是这台机器的偶然情况,不能当作跨机器的可靠假设。
如果把JVM默认Locale设成GERMANY,格式化出来的字符串还能被Double.parseDouble正确读回来吗?
StringFormatLocaleDemo.java Locale.setDefault(Locale.GERMANY); String result = String.format("%,.2f", val); // "1.234.567,89" Double.parseDouble(result); // 直接解析会怎样?
真实设置默认Locale为GERMANY后, String.format("%,.2f", val) 结果: 1.234.567,89
真实验证: 这个字符串能否被 Double.parseDouble 直接解析:
手动转换后可解析: 1234567.89
真实直接 Double.parseDouble(带千分位的字符串) 抛出异常: java.lang.NumberFormatException: multiple points
每一行都是真实运行这段代码得到的结果。