我已经创建了一个java应用程序,我使用DecimalFormat来格式化数字的输出。
DecimalFormat df = new DecimalFormat("#.##");
return Double.parseDouble(df.format(costs));
它在我的计算机上工作正常,但是当这个代码在另一台机器上执行时, 我收到这个错误:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "25,1"
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
两台机器都安装了最新的java版本,两者都是Windows 7.一台机器是64位,而另一台机器是32位。只有在另一台机器上发生错误的原因是什么?
答案 0 :(得分:5)
区域设置,一句话。一台机器是欧洲格式,#,#
,另一台是美国/英国,#.#
。
编辑:
使用DecimalFormat对象向两个方向传播:df.parse(...)
解析由df.format
创建的字符串。
答案 1 :(得分:2)
df.format(25.1)
根据默认或指定的区域设置返回格式化的数字String
。
Locale.US
, 即它将返回String
25.1
,而在Locale.ITALY
的情况下,它将返回25,1
作为十进制分隔符两种语言环境都不同。
另一个问题是您正在解析格式化的String
到double
。如果您有double
值(或其他有效数字),则无需使用DecimalFormat
格式化数字。
如果您使用有效号码String
(25.1
),则可以通过以下方式使用DecimalFormatter
对其进行解析,
NumberFormat nf = NumberFormat.getNumberInstance(Locale.ITALY);
DecimalFormat df = (DecimalFormat) nf;
df.applyPattern("#.##");
try {
System.out.println(df.parse("25,1"));
} catch (ParseException e) {
e.printStackTrace();
}
<强>输出强>
25.1