如何让DecimalFormat显示ASCII字符串而不是特殊符号?

时间:2011-12-19 10:33:52

标签: java string formatting numbers

在使用double字符串格式时,我注意到,至少在我的语言环境中,默认DecimalFormat对象生成的字符串与Double.toString()生成的字符串不同它涉及InfinityNaN等特殊情况。例如。来自这个片段:

for (double i : new double[]{ 1/0.0, -1/0.0, 0/0.0 }) {
    System.out.println(Double.toString(i));
    System.out.println(new DecimalFormat().format(i));
}

我得到了这个输出:

Infinity
∞
-Infinity
-∞
NaN
�

这不仅会导致注意NaNInfinity的现有代码出现问题,而且我的开发系统上的字体最后一个符号无法读取。据我所知,通过检查它的数值,最后一个符号是U+FFFD Unicode替换字符,这可能意味着它实际上没有被设置为有意义的东西。

因为对于我的一些应用程序,我更喜欢7位ASCII表示形式(“你接受的是自由主义,你所生产的东西是保守的”),是否有某种方法来强制字符串由DecimalFormat生成以匹配Double.toString()生成的内容?

一种方法可能是提供我自己的DecimalFormatSymbols,但似乎我必须自己设置所有相关字段,这听起来有些脆弱。有没有办法避免这种情况?

1 个答案:

答案 0 :(得分:2)

不幸的是,使用DecimalFormatSymbols类更改它的唯一方法。

http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

您可以从DecimalFormat获取DecimalFormatSymbols对象并进行修改。请参阅下面的代码段。所以你不需要设置所有字段。

DecimalFormat df = new DecimalFormat();
DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
dfs.setNaN("NaN");
df.setDecimalFormatSymbols(dfs);