Добавяне на запетаи (разделител за групиране) към число без промяна на десетичните знаци?

Опитвам се да форматирам низ, за ​​да добавя запетаи между 3-цифрени групи

EG:

1200.20 >> 1,200.20
15000   >> 15,000

Опитвам се да разбера как да го направя с DecimalFormat, до този момент използвах собствен скрипт, който изглежда прекалено сложен. Не мога да разбера как да го направя, използването на # просто скрива нулите в края, а използването на 0 ги добавя към числото.

Това е, което опитвам в момента:

DecimalFormat df = new DecimalFormat("###,###.####", new DecimalFormatSymbols(Locale.US));
resultStr = df.format(Double.valueOf(resultStr));

Сигурен съм, че трябва да е лесно, но не съм сигурен как да го направя. Не е нужно да го правя с DecimalFormat, просто си помислих, че ще е по-лесният начин. Как мога просто да добавя запетаите, без да променям десетичните знаци по никакъв начин?


person lisovaccaro    schedule 10.03.2013    source източник


Отговори (5)


Трябва да използвате обект NumberFormat и да го настроите да използва групиране. Нещо като

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberFormatEg {
   public static void main(String[] args) {
      NumberFormat myFormat = NumberFormat.getInstance();
      myFormat.setGroupingUsed(true);

      double[] numbers = { 11220.00, 232323232.24, 121211.55, 102.121212 };

      for (double d : numbers) {
         System.out.println(myFormat.format(d));
      }
      System.out.println();

      DecimalFormat decimalFormat = new DecimalFormat("#.00");
      decimalFormat.setGroupingUsed(true);
      decimalFormat.setGroupingSize(3);

      for (double d : numbers) {
         System.out.println(decimalFormat.format(d));
      }

      System.out.println("\nFor Germany");

      NumberFormat anotherFormat = NumberFormat
            .getNumberInstance(Locale.GERMAN);
      if (anotherFormat instanceof DecimalFormat) {
         DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat;
         anotherDFormat.applyPattern("#.00");
         anotherDFormat.setGroupingUsed(true);
         anotherDFormat.setGroupingSize(3);

         for (double d : numbers) {
            System.out.println(anotherDFormat.format(d));
         }

      }

      System.out.println("\nFor US:");

      anotherFormat = NumberFormat.getNumberInstance(Locale.US);
      if (anotherFormat instanceof DecimalFormat) {
         DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat;
         anotherDFormat.applyPattern("#.00");
         anotherDFormat.setGroupingUsed(true);
         anotherDFormat.setGroupingSize(3);

         for (double d : numbers) {
            System.out.println(anotherDFormat.format(d));
         }

      }
   }
}

който връща:

11,220
232,323,232.24
121,211.55
102.121

11,220.00
232,323,232.24
121,211.55
102.12

For Germany
11.220,00
232.323.232,24
121.211,55
102,12

For US:
11,220.00
232,323,232.24
121,211.55
102.12

Предимство на това е, че решението може да бъде специфично за локала.

Редактирано
Сега показва пример с обект DecimalFormat. Имайте предвид, че трябва да зададете размера на групирането, ако използвате това.

person Hovercraft Full Of Eels    schedule 10.03.2013
comment
@a_horse_with_no_name: вярно, той може да извика setGroupingUsed(true) на обекта DecimalFormat. - person Hovercraft Full Of Eels; 11.03.2013
comment
Използвах кода, макар и с десетичен формат. Въпреки това използва '.' вместо запетаи за групи. Как мога да го променя на ',' или Locale.US? - person lisovaccaro; 11.03.2013
comment
@Liso22: да, решението е специфично за локала. Уверете се, че локалът на обекта NumberFormat или DecimalFormat е зададен за регион, който използва запетаи като разделител за групиране. - person Hovercraft Full Of Eels; 11.03.2013
comment
Току що го пробвах. Всичко работи добре, докато не опитах число с 4 десетични знака и то започна да закръгля стойности. ПР.: 1.1237 става: 1.124. Знаете ли някакво решение за това? - person lisovaccaro; 11.03.2013
comment
Също така опитах това ` DecimalFormat anotherDFormat = (DecimalFormat) anotherFormat; anotherDFormat.applyPattern(#.00); anotherDFormat.setGroupingUsed(true); anotherDFormat.setGroupingSize(3); resultStr = anotherDFormat.format(Double.valueOf(1));` и връща 1,00 вместо 1 - person lisovaccaro; 11.03.2013
comment
@Liso22: да, ще върне 1,00, защото това е, което вашият формат казва, че трябва да върне. Защо това не е правилно? - person Hovercraft Full Of Eels; 11.03.2013

Можете също да опитате нещо подобно

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

System.out.println(df.format(1200.20));
System.out.println(df.format(15000));
System.out.println(df.format(123456789.99));
1,200.20
15,000.00
123,456,789.99
person arshajii    schedule 10.03.2013
comment
По-добре да се обадите на setGroupingUsed(true) и setGroupingSize(3), в противен случай решението ви няма да работи за номера › 999999,00. - person Hovercraft Full Of Eels; 11.03.2013
comment
@HovercraftFullOfEels Изглежда работи добре за такива числа, напр. _12_. - person arshajii; 11.03.2013
comment
Оттеглям казаното. 1+ Това е последният ми останал глас за деня. :( - person Hovercraft Full Of Eels; 11.03.2013

Трябва да можете да правите точно това, което искате:

http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html

DecimalFormat myFormatter = new DecimalFormat("$###,###.###");
String output = myFormatter.format(12345.67);
System.out.println(value + " " + pattern + " " + output);
person paulsm4    schedule 10.03.2013

Най-простото решение

Защо не използвате флаг със запетая , с printf.

System.out.printf( "%,d\n", 58625 );// the d to accept decimal integer
System.out.printf( "%,.2f", 12345678.9 );// the f to accept folouting point and 2 to take only 2 digits  

Резултатът ще бъде

58,625
12,345,678.90

И добрата новина: Използваният действително генериран разделител is specific to the user’s locale

person Basheer AL-MOMANI    schedule 08.02.2017

Не можах да накарам нито едно от другите решения да работят, някои закръглят десетичните знаци, други добавят нули в края или някои премахват нули в края.

Не планирам да приема собствения си отговор, но ще публикувам скрипта си, в случай че някой го намери за полезен.

public void(String str) {
    int floatPos = str.indexOf(".") > -1 ? str.length() - str.indexOf(".") : 0;
    int nGroups= (str.length()-floatPos-1-(str.indexOf("-")>-1?1:0))/3;
    for(int i=0; i<nGroups; i++){
        int commaPos = str.length() - i * 4 - 3 - floatPos;
    str = str.substring(0,commaPos) + "," + str.substring(commaPos,str.length());
    }
    return str;
}


1             => 1
1.0           => 1.0
1234.01       => 1,234.01
1100100.12345 => 1,100,100.12345
person lisovaccaro    schedule 11.03.2013