Вопрос-ответ

Best way to parseDouble with comma as decimal separator?

Лучший способ двойного разбора с запятой в качестве десятичного разделителя?

Из-за того, что запятая используется в качестве десятичного разделителя, этот код выдает NumberFormatException:

String p="1,234";
Double d=Double.valueOf(p);
System.out.println(d);

Есть ли лучший способ синтаксического анализа "1,234" для получения 1.234, чем: p = p.replaceAll(",",".");?

Переведено автоматически
Ответ 1

Используйте java.text.NumberFormat:

NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);
Number number = format.parse("1,234");
double d = number.doubleValue();

Обновлено:

Для поддержки многоязычных приложений используйте:

NumberFormat format = NumberFormat.getInstance(Locale.getDefault());
Ответ 2

Вы можете использовать это (во французской локали есть , для десятичного разделителя)

NumberFormat nf = NumberFormat.getInstance(Locale.FRANCE);
nf.parse(p);

Или вы можете использовать java.text.DecimalFormat и установить соответствующие символы:

DecimalFormat df = new DecimalFormat();
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator(' ');
df.setDecimalFormatSymbols(symbols);
df.parse(p);
Ответ 3

Как указывает E-Riz, NumberFormat.parse(String) преобразует "1,23abc" в 1.23. Чтобы использовать весь ввод, мы можем использовать:

public double parseDecimal(String input) throws ParseException{
NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault());
ParsePosition parsePosition = new ParsePosition(0);
Number number = numberFormat.parse(input, parsePosition);

if(parsePosition.getIndex() != input.length()){
throw new ParseException("Invalid input", parsePosition.getIndex());
}

return number.doubleValue();
}
Ответ 4
Double.parseDouble(p.replace(',','.'))

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

В принципе, замена (char, char) выполняется примерно в 10 раз быстрее, и поскольку вы будете делать подобные вещи в низкоуровневом коде, имеет смысл подумать об этом. Оптимизатор горячих точек не разберется с этим... Конечно, не в моей системе.

java