2011-12-19 79 views
3

虽然与double字符串格式化玩弄,我注意到,至少在我的区域,由默认DecimalFormat对象产生的字符串比Double.toString()产生的,当涉及到特殊的情况下,像InfinityNaN的有所不同。例如。从这个片段:如何让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 
� 

这不仅会导致与现有的代码是看出来NaNInfinity问题,但最后一个符号是不可读上的字体我的开发系统。据我所知,通过检查它的数值,最后一个符号是Unicode替换字符,这可能意味着它没有被设置为有意义的。

因为对于一些我的应用我喜欢7位ASCII表示(“在你接收的慷慨,是保守的,你生产什么”),是有一些方法来强制通过DecimalFormat产生的琴弦匹配那些由Double.toString()生产的?

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

回答

2

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

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

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

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

我会接受这个答案,因为这似乎是实际的答案,令人失望,因为它是... – thkala 2011-12-25 17:29:09

+0

'getDecimalFormatSymbols'返回内部对象的副本,所以修改它不会修改的符号现有的DecimalFormat对象。您需要调用'setDecimalFormatSymbols'或在DecimalFormat构造函数中传递DecimalFormatSymbols对象。 – Mikkel 2014-08-26 00:32:20

+0

正如@Mikkel指出的那样,您错过了一条附加指令:'df.setDecimalFormatSymbols(dfs);' – jcfrei 2016-02-17 14:49:38