虽然与double
字符串格式化玩弄,我注意到,至少在我的区域,由默认DecimalFormat
对象产生的字符串比Double.toString()
产生的,当涉及到特殊的情况下,像Infinity
和NaN
的有所不同。例如。从这个片段:如何让DecimalFormat显示ASCII字符串而不是特殊符号?
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
问题,但最后一个符号是不可读上的字体我的开发系统。据我所知,通过检查它的数值,最后一个符号是Unicode替换字符,这可能意味着它没有被设置为有意义的。
因为对于一些我的应用我喜欢7位ASCII表示(“在你接收的慷慨,是保守的,你生产什么”),是有一些方法来强制通过DecimalFormat
产生的琴弦匹配那些由Double.toString()
生产的?
一种方法可能是提供我自己的DecimalFormatSymbols
,但似乎我必须自己设置所有相关字段,这听起来有点脆弱。有没有办法避免这种情况?
我会接受这个答案,因为这似乎是实际的答案,令人失望,因为它是... – thkala 2011-12-25 17:29:09
'getDecimalFormatSymbols'返回内部对象的副本,所以修改它不会修改的符号现有的DecimalFormat对象。您需要调用'setDecimalFormatSymbols'或在DecimalFormat构造函数中传递DecimalFormatSymbols对象。 – Mikkel 2014-08-26 00:32:20
正如@Mikkel指出的那样,您错过了一条附加指令:'df.setDecimalFormatSymbols(dfs);' – jcfrei 2016-02-17 14:49:38