0

我想准确地解析一个整数,一个可能根据当前语言环境格式化的整数。如果我没有准确地解析整数,我想知道它。所以我使用:

String string = "1111122222333334444455555";
Locale locale = Locale.getDefault();
NumberFormat numberFormat = NumberFormat.getIntegerInstance(locale);
numberFormat.setParseIntegerOnly();
Number number = numberFormat.parse(string);

显然"1111122222333334444455555"代表一个很大的数字,比一个Long可以处理的大。所以NumberFormat给了我……一个Double??

我想我会期望收到 aBigInteger而不是 a Double,尤其是因为我要求使用特定于整数的数字格式化程序。但没关系;更大的问题是我得到的双倍价值是1.1111222223333344E24!这不等于1111122222333334444455555!!

如果NumberFormat给我的解析值等于输入字符串中存储的值,我该如何检测?

换句话说:“我怎么知道Double我得到的值是否NumberFormat与原始字符串中表示的整数值完全相等?”

4

3 回答 3

0

javadocs for state 如果可能,parse()它将返回一个 Long,否则它将返回一个 Double。因此,只需检查返回值是否为 Long。

“如果可能,返回一个 Long(例如,在 [Long.MIN_VALUE, Long.MAX_VALUE] 范围内并且没有小数),否则返回一个 Double。”

“我怎么知道我从 NumberFormat 得到的 Double 值是否完全等于原始字符串中表示的整数值?”

如果它返回一个 Double,那么它完全等于您的整数值,因为 Double 不能准确地表示该大小的值。具体例子:

  Number a = numberFormat.parse("-9223372036854775809"); // Integer.MIN_VALUE - 1
  Number b = numberFormat.parse("-9223372036854775810"); // Integer.MIN_VALUE - 2
  System.out.println((a.equals(b))); // prints "true"
  Number c = numberFormat.parse("-9223372036854776800");
  System.out.println((a.equals(c))); // prints "true"
于 2012-06-29T16:47:06.160 回答
0

这可能不是解决方案,但值得注意。

public static void main(String[] args) {
        String string = "1111122222333334444455555";
        Locale locale = Locale.getDefault();
        NumberFormat numberFormat = NumberFormat.getIntegerInstance(locale);
        numberFormat.setParseIntegerOnly(true);
        Number number = numberFormat.parse(string);
        BigDecimal b = new BigDecimal(number.toString());
        System.out.println(b.toBigInteger());

    }

此代码的输出是:1111122222333334400000000

如您所见,这不等于实际字符串中的数字,因此它们可能发生溢出。

于 2012-06-29T17:48:57.770 回答
0

对于你的问题 -

If NumberFormat gives me a parsed value that does not equal that stored in the input string, how do I detect that?

您可以使用

    if(number.toString().equals(string))
      //Parsed correctly
   else
     //Invalid parse
于 2012-06-29T16:50:54.730 回答