Форматирование числа с правильной десятичной шкалой

Мне нужно отформатировать число со шкалой из 2 знаков после запятой. Исходное число может быть целым числом или числом с тремя десятичными знаками. Однако результат должен быть отформатирован так, чтобы всегда были запятые, а также два десятичных разряда, независимо от того, является ли исходное число целым числом или имеет десятичные разряды.

  1. Когда исходное число = 56565656,342 ==> мне нужно 56 565 656,34
  2. Когда исходное число = 56565656 ==> мне нужно 56 565 656,00
  3. Когда исходное число = 56565656,7 ==> мне нужно 56 565 656,70

Я использую следующий код, который форматирует код, но не может добавить два десятичных знака в приведенных выше случаях 2 и 3.

String originalNumber = "56565656.7";
BigDecimal b = new BigDecimal(originalNumber).setScale(2, BigDecimal.ROUND_HALF_UP);
String formattedNumber = NumberFormat.getInstance().format(b);

Пожалуйста, дайте мне знать, есть ли способ сделать это эффективным способом.

Заранее спасибо.


person JavaYouth    schedule 08.08.2012    source источник


Ответы (3)


Взгляните на класс DecimalFormat.

В качестве альтернативы вы можете setScale из класса BigDecimal.

        BigDecimal bg1 = new BigDecimal("56565656.342");
        BigDecimal bg2 = new BigDecimal("56565656.00");
        BigDecimal bg3 = new BigDecimal("56565656.70");

        DecimalFormat df = new DecimalFormat("###,###.00");
        System.out.println(df.format(bg1.doubleValue()));
        System.out.println(df.format(bg2.doubleValue()));
        System.out.println(df.format(bg3.doubleValue()));

        System.out.println(bg1.setScale(2, BigDecimal.ROUND_HALF_UP));
        System.out.println(bg2.setScale(2, BigDecimal.ROUND_HALF_UP));
        System.out.println(bg3.setScale(2, BigDecimal.ROUND_HALF_UP));

Урожайность:

56,565,656.34
56,565,656.00
56,565,656.70
56565656.34
56565656.00
56565656.70

РЕДАКТИРОВАТЬ: Также забыл упомянуть: если вам нужна точность, я бы порекомендовал вам использовать метод setScale, использование метода .doubleValue() даст double, что может привести к потере точности.

person npinti    schedule 08.08.2012
comment
Если вы используете следующее при построении DecimalFormat DecimalFormat df = new DecimalFormat("###,###.00");, первые три println будут печатать с двумя цифрами после запятой. - person DB5; 08.08.2012

Просто используйте NumberFormat и укажите цифры дроби и метод округления для печати:

String [] originalNumbers = new String[] {
   "56565656.342",
   "56565656.7",
   "56565656"
};

NumberFormat df = NumberFormat.getInstance();
df.setMinimumFractionDigits(2);
df.setMaximumFractionDigits(2);
df.setRoundingMode(RoundingMode.HALF_UP);

for (String number : originalNumbers) {
   String formattedNumber = df.format(new BigDecimal(number));

   System.out.println(formattedNumber);
}

Будет печатать

56,565,656.34
56,565,656.70
56,565,656.00

** Изменить **

DecimalFormat df = new DecimalFormat("#,###.00");

Будет давать точно такой же результат с данным кодом выше.

person Yanick Rochon    schedule 08.08.2012

Класс DecimalFormat сделает это за вас... Вам нужно будет указать соответствующий формат.

person Sumit Desai    schedule 08.08.2012
comment
Ваш ответ был слишком расплывчатым. Если вы потратите всего пару строк на объяснение чего-либо и не предоставите ни одной строки кода, вы можете быть уверены, что ответ не будет адекватным. - person Richard Gomes; 06.04.2015