Я хочу точно проанализировать целое число, которое потенциально было отформатировано в соответствии с текущей локалью. Если я не проанализировал целое число точно, я хочу это знать. Поэтому я использую:
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
, тем более, что я попросил форматирование целых чисел. Но это неважно; большая проблема заключается в том, что двойное значение, которое я возвращаю, равно 1.1111222223333344E24
! Это не равно 1111122222333334444455555
!!
Если NumberFormat
дает мне проанализированное значение, которое не равно значению, хранящемуся во входной строке, как мне это определить?
Другими словами: «Как я могу узнать, точно ли значение Double
, которое я получаю от NumberFormat
, эквивалентно целочисленному значению, представленному в исходной строке?»
Long.parseLong()
, вы получите исключение переполнения. - person Marko Topolnik   schedule 29.06.2012Long
. Я не хочу, чтобы меня заставляли использоватьBigInteger
, если этого не требует номер. Кроме того, конструкторBigInteger
не обращает внимания на локаль (см. обновленный вопрос). - person Garret Wilson   schedule 29.06.2012Long
? Если это не признак переполнения, не так ли? - person Marko Topolnik   schedule 29.06.2012"1,234"
в локалиen_US
даст целое число1234
, конечно, но в локалиfr_FR
мне нужно будет определить, что"1,234"
вообще не является допустимым целым числом (это значение с плавающей запятой1.234
). - person Garret Wilson   schedule 29.06.2012Long.parseLong
. Но теперь я не вижу, что было бы не так с проверкой типа возвращаемого значения. - person Marko Topolnik   schedule 29.06.2012Double
как никогда хорошо представляет собой точное представление входной строки, аLong
всегда имеет идеальную точность. - person Marko Topolnik   schedule 29.06.2012long
кdouble
, а затем обратно кlong
, в большинстве случаев я не получу того же значения, что меня очень удивит. Если бы вы говорили о дробных значениях, я бы согласился, но это не относится к делу. - person Garret Wilson   schedule 29.06.20125
. - person Garret Wilson   schedule 29.06.2012long
плотность составляет примерно один к двум тысячам (одинlong
из двух тысяч можно представить, округлив некоторое значениеdouble
). - person Marko Topolnik   schedule 29.06.2012