Подтвердить что ты не робот

Лучший способ конвертировать локальную специфическую строку в 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. Однако количество цифр не всегда известно.

Третий вывод, очевидно, не тот, который я ищу.

Мой вопрос, какой был бы лучший способ? Есть ли лучшие способы сделать это?

4b9b3361

Ответ 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);