Ява. Отформатируйте дробную часть с помощью DecimalFormat

Небольшой вопрос о DecimalFormat в Java.

Мне нужно вывести число 178500.59999 вроде (178 500 599 99)

Я попытался использовать новый DecimalFormat (format = ###,##0.00), и результат был 178 500,59.

Как я могу сделать это с DecimalFormat для отображения всей дробной части (часть может иметь любую длину) + дробная часть была отформатирована как 178 500 599 99


person Sky    schedule 15.01.2018    source источник


Ответы (2)


Хотя это немного хакерски, вы можете расширить класс десятичного формата следующим образом:

    DecimalFormatSymbols formatSymbols = new
            DecimalFormatSymbols(Locale.getDefault());
    formatSymbols.setDecimalSeparator(',');
    formatSymbols.setGroupingSeparator(' ');
    final String pattern = "####,####.#####";
    DecimalFormat decimalFormat = new DecimalFormat(pattern, formatSymbols) {
        @Override
        public StringBuffer format(double number, StringBuffer res, FieldPosition fieldPosition) {
            StringBuffer noSpaceOnDecimalPart = super.format(number, res, fieldPosition);

            String result = noSpaceOnDecimalPart.toString();

            if (noSpaceOnDecimalPart != null) {
                int indexOf = noSpaceOnDecimalPart.indexOf(String.valueOf(getDecimalFormatSymbols().getDecimalSeparator()));
                if (indexOf >= 0) {
                    String integerPart = noSpaceOnDecimalPart.substring(0, indexOf);
                    String decimalPart = noSpaceOnDecimalPart.substring(indexOf + 1);

                    StringBuilder formattedDecimal = new StringBuilder("");

                    int i = 0;
                    while (i < decimalPart.length()) {
                        if (i != 0 && i % 3 == 0) {
                            formattedDecimal.append(getDecimalFormatSymbols().getGroupingSeparator());
                        }
                        formattedDecimal.append(decimalPart.charAt(i));
                        i++;
                    }

                    result = integerPart + getDecimalFormatSymbols().getDecimalSeparator() + formattedDecimal;
                }
            }

            return new StringBuffer(result);
        }
    };
    decimalFormat.setGroupingSize(3);
    String number = decimalFormat.format(178500.59999);
    System.out.println(number); // prints 178 500,599 99

Это всего лишь демонстрация, в зависимости от вашего варианта использования вы можете оптимизировать код и добавить поддержку дополнительных конфигураций (лучше соблюдайте контракт DecimalFormat), но это, по крайней мере, отправная точка. Я не нашел способа добавить пробелы к десятичной части с помощью более обычного кода.

person spi    schedule 16.01.2018
comment
Спасибо за вашу помощь - person Sky; 16.01.2018

Вы можете попробовать что-то вроде этого:

DecimalFormatSymbols formatSymbols = new 
DecimalFormatSymbols(Locale.getDefault());
formatSymbols.setDecimalSeparator(',');
formatSymbols.setGroupingSeparator(' ');
String pattern = "####,####.#####";
DecimalFormat decimalFormat = new DecimalFormat(pattern, formatSymbols);
decimalFormat.setGroupingSize(3);
String number = decimalFormat.format(178500.59999);
System.out.println(number);
person diego.samuel.alves    schedule 15.01.2018
comment
по-прежнему нет разделителя в десятичной части. - person spi; 15.01.2018
comment
Ага. Мне нужны пробелы в десятичной части. Это важно - person Sky; 16.01.2018