英文:
DecimalFormat uses comma separator even when the pattern specified is a dot
问题
最后一行失败并出现NumberFormatException,因为小数点被逗号分隔。可能的原因是您的本地设置或语言环境将小数点解释为逗号。您可以尝试以下解决方法:
-
更改本地设置或语言环境为使用小数点而不是逗号作为小数分隔符。
-
在代码中使用
Locale
来指定使用小数点。例如:
DecimalFormat df = new DecimalFormat("0.00", new DecimalFormatSymbols(Locale.US));
这将使用美国的本地设置,其中小数点是小数的分隔符。
请注意,这只是一个可能的解决方案,具体取决于您的环境和要求。
英文:
I have the below code for formatting a double to two decimal places;
DecimalFormat df = new DecimalFormat("0.00");
double monthlyVal = forecastReturnValue / months;
return Double.valueOf(df.format(monthlyVal));
The last line fails with a NumberFormatException because decimals are separated by a comma;
I am using windows OpenJDK8:
openjdk version "1.8.0_41"
OpenJDK Runtime Environment (build1.8.0_41-b04)
OpenJDK Client VM (build 25.40-b25, mixed mode)
What could be the cause?
答案1
得分: 1
DecimalFormat
仅用于格式化值。Double.valueOf
不知道格式,如果要解析这种字符串,必须使用 DecimalFormat
:
return df.parse(df.format(monthlyVal));
英文:
The DecimalFormat
ist only for formating the value. Double.valueOf
doesn't know the format and expect a .
if you want to parse duch string you have to use DecimalFormat
for parsing this value:
return df.parse(df.format(monthlyVal));
答案2
得分: 1
原因是Locale
。默认情况下,您连接到系统上的Locale,它返回逗号作为小数分隔符。要更改使用DecimalFormat,执行以下操作:
DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US);
DecimalFormat df = new DecimalFormat("0.00", symbols);
double monthlyVal = forecastReturnValue / months;
return Double.valueOf(df.format(monthlyVal));
依我之见,我建议在这种情况下使用BigDecimal,因为它更精确,更不容易出错,并且更容易处理四舍五入、缩放等用途。
等价的方式可以是:
BigDecimal monthlyVal = BigDecimal.valueOf(20.0).divide(BigDecimal.valueOf(12), 2, RoundingMode.CEILING); // 2是标度。RoundingMode取决于您
System.out.println(monthlyVal);
英文:
The cause is the Locale
. By default, you are connected to the Locale on your system, which return a decimal separator as ,
. Using DecimalFormat, to change, do the following:
DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US);
DecimalFormat df = new DecimalFormat("0.00", symbols);
double monthlyVal = forecastReturnValue / months;
return Double.valueOf(df.format(monthlyVal));
IMHO, I'd recommend using BigDecimal for such use cases, as it is more accurate, less error prone, and handle easily usage of rounding, scaling and so on.
The equivalent could be:
BigDecimal monthlyVal = BigDecimal.valueOf(20.0).divide(BigDecimal.valueOf(12), 2, RoundingMode.CEILING); // 2 is the scale. RoundingMode is up to you
System.out.println(monthlyVal);
答案3
得分: 1
当你写new DecimalFormat("0.00");
时,你没有指定分隔符类型。你只是指定了应该有一个分隔符。分隔符仍然会基于你的区域设置。
格式字符串使用"."作为小数点分隔符。
如果你想使用'.'作为小数点分隔符,你可以更改你的区域设置。
英文:
When you write new DecimalFormat("0.00");
you are not specifying the separator type. You are just specifying that there should be a separator. The separator will still be based on your locale.
Format Strings us "." as the decimal separator.
If you want to use a '.' you can change your locale.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论