Java - Как преобразовать строку в большой десятичный с денежным форматом - PullRequest
0 голосов
/ 12 февраля 2019

Моя строка "1234567", и я хочу получить два больших десятичных объекта, таких как 12345,67 и 12,345,67, но я не смог этого сделать.Код показан ниже:

DecimalFormat decimalFormat = new DecimalFormat("#,##0.###");
decimalFormat.setParseBigDecimal(true);
String n = decimalFormat.format(1234567);
BigDecimal bigDecimal = (BigDecimal)decimalFormat.parse(n);

DecimalFormat decimalFormat1 = new DecimalFormat("#,0#");
decimalFormat1.setParseBigDecimal(true);
String n1 = decimalFormat.format(1234567);
BigDecimal bigDecimal1 = (BigDecimal)decimalFormat.parse(n1);

System.out.println(n);
System.out.println(bigDecimal);
System.out.println(n1);
System.out.println(bigDecimal1);

Выход:

1.234.567,00
1234567.00
1.234.567,00
1234567.00

Ожидаемый результат:

12,345,67 12,345,67
12345,67
12345,67

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 13 февраля 2019

Форматирование чисел всегда зависит от локали.Поэтому необходима определенная локаль.Для форматирования будет работать следующий подход:

    BigDecimal money = new BigDecimal("1234567");

    DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.GERMAN);
    symbols.setDecimalSeparator(',');
    symbols.setGroupingSeparator('.');

    // https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html
    DecimalFormat format = new DecimalFormat("###,###.00");
    format.setDecimalFormatSymbols(symbols);

    System.out.println(format.format(money));

Однако это не отвечает требованию разбирать любое заданное число как десятичное с двумя цифрами.Здесь я бы лично применил деление на 100 или вставил десятичный разделитель в данную строку.

    BigDecimal money = new BigDecimal("1234567").divide(new BigDecimal("100"));

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

    private static String prepare(String input) {
        if (input.length() == 2) {
            return ","+input;
        } 
        if (input.length() == 1) {
            return ",0"+input;
        }
        String integerPart = input.substring(0, input.length()-2);
        String fraction = input.substring(input.length()-2);
        return integerPart+","+fraction;
    }

Используя новый DecimalFormat и метод prepare(), он будет работать для анализа строки как числа с двумя десятичными знаками по умолчанию.

    String input = "1234567";
    String prepared = prepare(input);

    DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.GERMAN);
    symbols.setDecimalSeparator(',');
    symbols.setGroupingSeparator('.');

    DecimalFormat format = new DecimalFormat("###,###.00");
    format.setDecimalFormatSymbols(symbols);
    format.setParseBigDecimal(true);

    BigDecimal bigDecimal = (BigDecimal)format.parse(prepared);
    String n = format.format(bigDecimal);

    System.out.println(n);
...