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

Трябва да форматирам число със скала от 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 ще се отпечатат с 2 цифри след десетичната запетая. - 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