Лучший способ конвертировать локальную специфическую строку в BigDecimal
Мне нужно преобразовать строку, форматированную в немецком языке, в BigDecimal. Тем не менее, я борюсь с лучшим решением.
Следующий код показывает мою проблему:
String numberString = "2.105,88";
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
try {
Number parsed = nf.parse(numberString);
BigDecimal bd1 = new BigDecimal(parsed.toString());
System.out.println(bd1.toString());
BigDecimal bd2 = new BigDecimal(parsed.doubleValue());
System.out.println(bd2);
BigDecimal bd3 = new BigDecimal(numberString);
System.out.println(bd3);
} catch (ParseException e) {
e.printStackTrace();
}
Изгиб этого
2105,88
2105,8800000000001091393642127513885498046875
Исключение в потоке "main" java.lang.NumberFormatException в java.math.BigDecimal. (Неизвестный источник) в java.math.BigDecimal. (Неизвестный источник) в test.BigDecimalTest.main(BigDecimalTest.java:22)
Первый вывод правильный, но на самом деле не имеет смысла преобразовать String
в Number
(Double
, если быть точным), а затем вернуться к String
снова, а затем в конкретную тип Number
, BigDecimal
.
Второй вывод неверен, но его можно решить, установив масштаб BigDecimal. Однако количество цифр не всегда известно.
Третий вывод, очевидно, не тот, который я ищу.
Мой вопрос, какой был бы лучший способ? Есть ли лучшие способы сделать это?
Ответы
Ответ 1
Похоже, нет другого пути, поскольку java.Lang.Number не имеет метода, который возвращает тип BigDecimal. В любом случае это имеет смысл, потому что BigDecimal принимает только строки, которые должным образом отформатированы не как "2.105,88", а как "2105.88",
Позвольте мне показать ваш код:
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class JavaMain {
public static void main(String[] args) {
String numberString = "2.105,88";
//using casting
try {
DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.GERMAN);
df.setParseBigDecimal(true);
BigDecimal bd = (BigDecimal) df.parseObject(numberString);
System.out.println(bd.toString());
} catch (ParseException e) {
e.printStackTrace();
}
//your way short version
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
try {
BigDecimal bd1 = new BigDecimal(nf.parse(numberString).toString());
System.out.println(bd1.toString());
} catch (ParseException e) {
e.printStackTrace();
}
String numberStringFixed = "2105.88";
//direct string formated
System.out.println(new BigDecimal(numberStringFixed));;
//direct but erroneous way if the string is not formated
System.out.println(new BigDecimal(numberString));;
}
}
Надеюсь, это поможет!
Ответ 2
DecimalFormat
имеет метод setParseBigDecimal
, который заставляет parse()
возвращать BigDecimal
. Вам просто нужно отдать возвращенный Number
.
Ответ 3
Проблема заключается в форматировании вашей строки. Вы должны пойти с 3-м методом, но форматируйте свою строку следующим образом: String numberString = "2105.88";
Вы сможете увидеть это из приведенных здесь примеров:
Ссылка на Java Api
Изменить:
Хорошо, поэтому я вижу два возможных решения для этого. Либо идите с вашим решением 1 (что я предпочитаю), либо сделайте что-то вроде:
numberString = numberString.replaceAll(".", "");
numberString = numberString.replaceAll(",", ".");
BigDecimal bd3 = new BigDecimal(numberString);