Я хочу точно проанализировать целое число, которое было потенциально отформатировано в соответствии с текущей локалью. Если бы я не разбирал целое число точно, я хочу это знать. Поэтому я использую:Обнаруживать неточность номера NumberFormat
String string = "1111122222333334444455555";
Locale locale = Locale.getDefault();
NumberFormat numberFormat = NumberFormat.getIntegerInstance(locale);
numberFormat.setParseIntegerOnly();
Number number = numberFormat.parse(string);
Очевидно "1111122222333334444455555"
представляет собой большое число, большее, чем Long
может справиться. Так NumberFormat
дает мне ... a Double
??
Я предполагаю, что я ожидал получить BigInteger
, а не Double
, тем более что я попросил форматировать числовые числа. Но не обращайте на это внимания; большая проблема заключается в том, что двойное значение, которое я получаю, это 1.1111222223333344E24
! Это не равно 1111122222333334444455555
!!
Если NumberFormat
дает мне разобранное значение, которое делает не равным тому, что хранится во входной строке, как это обнаружить?
Путь другой: «Как я могу узнать, имеет ли значение Double
значение, полученное от NumberFormat
, в точности эквивалентно интегральному значению, представленному в исходной строке?»
Если вы используете простой 'Long.parseLong()', вы получите исключение переполнения. –
Почему бы просто не построить BigInteger со строкой ввода вместо того, чтобы пытаться его разобрать? –
@MarkoTopolnik, мне нужно поддерживать значения, которые, возможно, были отформатированы в текущем локальном (например, «1,234» в США). Я обновил вопрос, чтобы отразить это. –