2013-03-10 10 views
8

Ich versuche, eine Zeichenfolge zu formatieren Kommas zwischen 3-stelligen GruppenKomma (Gruppierungstrennzeichen) zu Zahl hinzufügen, ohne Dezimalstellen zu ändern?

EG hinzuzufügen:

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

Ich versuche, herauszufinden, wie es zu diesem Punkt mit DecimalFormat zu tun, war ich schon mit einem eigenen Skript, das zu kompliziert erscheint. Ich kann nicht herausfinden, wie es geht, mit # werden einfach die folgenden Nullen versteckt und mit 0 werden sie zu der Zahl hinzugefügt.

Das ist, was ich jetzt versuchen:

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

Ich bin sicher, dass es einfach sein muss, aber ich bin nicht sicher, wie es zu tun. Ich muss es nicht mit DecimalFormat machen, ich dachte nur, es wäre der leichtere Weg. Wie kann ich einfach die Kommas hinzufügen, ohne die Dezimalstellen zu verändern?

Antwort

14

Sie sollten ein NumberFormat-Objekt verwenden und es für die Gruppierung festlegen. So etwas wie

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)); 
     } 

     } 
    } 
} 

, die zurückgibt:

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 

Ein Vorteil davon ist, dass die Lösung locale spezifisch sein kann.

Edited
Jetzt zeigt ein Beispiel mit einem DecimalFormat Objekt. Beachten Sie, dass Sie die Gruppierungsgröße festlegen sollten, wenn Sie diese verwenden.

+0

A 'DecimalFormat' *** ist *** ein' NumberFormat' –

+0

@a_horse_with_no_name tatsächlich erzeugten verwendet : True, er könnte 'setGroupingUsed (true)' auf dem DecimalFormat-Objekt aufrufen. –

+0

Ich habe den Code mit Dezimalformat verwendet. Es verwendet jedoch '.' anstelle von Kommas für Gruppen. Wie kann ich es in ',' oder Locale.US ändern? – lisovaccaro

10

können Sie auch so etwas wie

versuchen
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 
+0

Besser 'setGroupingUsed (true)' und 'setGroupingSize (3)' zu nennen, sonst funktioniert Ihre Lösung nicht für Nummern> 999999.00. –

+0

@HovercraftFullOfEels scheint für solche Zahlen, z. '9999999.00' ->' 9.999.999,00'. – arshajii

+0

Ich ziehe zurück, was ich gesagt habe. 1+ Das ist meine letzte abgegebene Stimme für den Tag. :( –

1

ich nicht von machen könnte die anderen Lösungen funktionieren, einige um die Dezimalstellen herum, einige fügen nachgestellte Nullen hinzu oder einige entfernen nachgestellte Nullen.

Ich plane nicht meine eigene Antwort zu akzeptieren, aber ich werde meinen Skript schreiben, wenn jemand es nützlich findet.

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 
0

Die einfachste Lösung

Warum nutzen Sie nicht die comma , flag mit 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 

wird der Ausgang

58,625 
12,345,678.90 

Und die gute Nachricht: Der Separator is specific to the user’s locale

Verwandte Themen