例如:
NumberFormat nf = NumberFormat.newInstace();
Number number = nf.parse("0.0");
number
在运行时被解析为java.lang.Integer
,即使很明显值是Double
。
多数情况下,这不是问题,因为无论如何该值都包装在Number
中,但是问题在于Number
并没有实现Comparable
,我不得不求助于它。
是否存在一个类,它假设类似"0.0"
的字符串来表示Double
?
答案 0 :(得分:1)
Numberformat知道您所在地区的数字写入方式。例如在意大利,您将“,”作为小数点。因此:
[
{
"operation": "shift",
"spec": {
"Parent": {
"Child": {
"GrandChild": {
"*": {
"DeepDown": {
"*": {
"Field1": "Root.RepeatThis.[&3].Element1",
"Field2": "Root.RepeatThis.[&3].Element2",
"Field3": "Root.RepeatThis.[&3].Element3"
}
}
}
}
}
}
}
}
]
0.1
如果您使用的是“。”只是用来创建组(例如,成千上万个),结果将为1(正确的是01为1):
NumberFormat nf = NumberFormat.getInstance(Locale.ITALY);
Number number = nf.parse("0,1");
System.err.println(number);
1
现在具有英语语言环境,则完全相反:
NumberFormat nf = NumberFormat.getInstance(Locale.ITALY);
Number number = nf.parse("0.1");
System.err.println(number);
0.1
最后是带有“,”的英语:
NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH);
Number number = nf.parse("0.1");
System.err.println(number);
1
有人争论拖尾0。所以:
NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH);
Number number = nf.parse("0,1");
System.err.println(number);
d和d2的值相同。这与我在代码中分配变量的行为完全相同。
NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH);
double d = nf.parse("17").doubleValue();
double d2 = nf.parse("17.000").doubleValue();
两个变量将包含相同的数字。在两种情况下都不会降低精度。
另外,比较将正确返回true:
double d = 17;
double d2 = 17.000;
true
与代码中的行为相同:
boolean test = nf.parse("17") == nf.parse("17.000");
System.err.print( test );
true
最后,NumberFormat的返回类型为“数字”。它解析数字是什么:数字。因此,这既不是Double也不是Long(就像动物不是狗也不是猫,即使狗不是动物也是如此)。
如果您确实需要一个double,则只需使用number.doubleValue()即可,它可靠地为您提供了所需的类型。