Java`NumberFormat`假定数字类型错误

时间:2019-02-06 18:45:23

标签: java string string-formatting number-formatting

例如:

NumberFormat nf = NumberFormat.newInstace();
Number number = nf.parse("0.0");

number在运行时被解析为java.lang.Integer,即使很明显值是Double。 多数情况下,这不是问题,因为无论如何该值都包装在Number中,但是问题在于Number并没有实现Comparable,我不得不求助于它。

是否存在一个类,它假设类似"0.0"的字符串来表示Double

1 个答案:

答案 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()即可,它可靠地为您提供了所需的类型。