在使用double
字符串格式时,我注意到,至少在我的语言环境中,默认DecimalFormat
对象生成的字符串与Double.toString()
生成的字符串不同它涉及Infinity
和NaN
等特殊情况。例如。来自这个片段:
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
�
这不仅会导致注意NaN
和Infinity
的现有代码出现问题,而且我的开发系统上的字体最后一个符号无法读取。据我所知,通过检查它的数值,最后一个符号是U+FFFD
Unicode替换字符,这可能意味着它实际上没有被设置为有意义的东西。
因为对于我的一些应用程序,我更喜欢7位ASCII表示形式(“你接受的是自由主义,你所生产的东西是保守的”),是否有某种方法来强制字符串由DecimalFormat
生成以匹配Double.toString()
生成的内容?
一种方法可能是提供我自己的DecimalFormatSymbols
,但似乎我必须自己设置所有相关字段,这听起来有些脆弱。有没有办法避免这种情况?
答案 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);