NumberFormatException при разборе числа

String str="123456.7855456677";
ParsePosition parsePosition = new ParsePosition(0);
NumberFormat numberFormat=new DecimalFormat();
Number number=numberFormat.parse(str, parsePosition);

if(parsePosition.getIndex()!=str.length())
{
    throw new IllegalArgumentException();
}

numberFormat.setMaximumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
double value=Double.parseDouble(numberFormat.format(number));
System.out.println(value);

Значение переменной типа String str в этом сегменте кода может быть любым динамическим значением, при условии, что пользователь может вводить любую строку.

Метод Double.parseDouble() в последней строке приводит к выдаче java.lang.NumberFormatException.

Удаление строки numberFormat.setMaximumFractionDigits(2); и установка RegEx для перегруженного конструктора класса DecimalFormat, как обычно, например,

NumberFormat numberFormat=new DecimalFormat("#.##");

подавляет исключение.

Так почему иначе не работает?


person Tiny    schedule 11.02.2013    source источник


Ответы (2)


Если вы можете отладить код, то проверьте, что эта строка numberFormat.format(number) содержит число, содержащее запятую, которая может стать причиной исключения, проверьте это 123,456.79, и этой запятой не должно быть... надеюсь, это поможет.

person NoNaMe    schedule 11.02.2013
comment
Однако входная строка 123456.7855456677. - person Tiny; 11.02.2013
comment
Исходная строка 123456.7855456677, хранящаяся в переменной типа String str, представляется как Number перед синтаксическим анализом в Double. - person Tiny; 11.02.2013
comment
Просматривая список методов, доступных в классе NumberFormat, я мог видеть, что он должен что-то делать с группировкой в ​​число, число по умолчанию представлено в группе, например 111 222 333. Я использовал numberFormat.setGroupingUsed(false);, и исключение исчезло. - person Tiny; 11.02.2013
comment
Благодаря обоим ответам. На самом деле это одно из моих требований в моем веб-приложении с использованием Spring/Hibernate, где я реализую глобальные преобразователи. Я действительно однажды использовал метод NumberFormat#setGroupingUsed(boolean);, но случайно забыл использовать его в этом сегменте кода. Спасибо. - person Tiny; 11.02.2013

Exception in thread "main" java.lang.NumberFormatException: For input string: "123,456.79" В строковом представлении двойных чисел не может быть запятой.

person Christophe Roussy    schedule 11.02.2013
comment
Однако входная строка 123456.7855456677. - person Tiny; 11.02.2013
comment
Нет, вход функции Double.parseDouble является результатом numberFormat.format(number), который равен 123,456.79, который содержит запятую и вызывает исключение - person Christophe Roussy; 11.02.2013