0

現在のロケールに従ってフォーマットされている可能性のある整数を正確に解析したいと思います。整数を正確に解析しなかった場合は、それを知りたいです。だから私は使用します:

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

明らかに、缶が処理できる"1111122222333334444455555"よりも大きい大きな数を表します。LongだからNumberFormat私に... Double??

特に整数固有の数値フォーマッターを要求したので、私はでBigIntegerはなくを受け取ることを期待していたと思います。Doubleしかし、それを気にしないでください。より大きな問題は、私が返すdouble値が1.1111222223333344E24!これは等しくありません1111122222333334444455555!!

入力文字列に格納されている値と等しくないNumberFormat解析値が表示された場合、それを検出するにはどうすればよいですか?

別の言い方をすれば、「Double取得した値NumberFormatが元の文字列で表された整数値と正確に等しいかどうかをどのように知ることができますか?」

4

3 に答える 3

0

javadocsparse()、可能であれば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

あなたの質問のために-

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 に答える
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 に答える