Wie kann ich eine String-Nummer so formatieren, dass sie Kommas und Runden enthält?


142

Was ist der beste Weg, um die folgende Nummer zu formatieren, die mir als String gegeben wird?

String number = "1000500000.574" //assume my value will always be a String

Ich möchte, dass dies ein String mit dem Wert ist: 1,000,500,000.57

Wie kann ich es als solches formatieren?

Antworten:


256

Vielleicht möchten Sie sich die DecimalFormatKlasse ansehen . Es werden verschiedene Gebietsschemas unterstützt (z. B. in einigen Ländern, die 1.000.500.000,57stattdessen so formatiert werden).

Sie müssen diese Zeichenfolge auch in eine Zahl konvertieren. Dies kann folgendermaßen erfolgen:

double amount = Double.parseDouble(number);

Codebeispiel:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));

Können Sie ein Beispiel zeigen, wie ich NumberFormat in diesem speziellen Fall verwenden kann?
Sheehan Alam

1
Sie können auch die folgende Lösung verwenden: public static String getRoundOffValue (doppelter Wert) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); return df.format (Wert); }
Jitendra Nath

Ich bevorzuge auch die Null vor dem Punkt wie DecimalFormat formatter = new DecimalFormat ("#, ## 0.00"); - .00 für Null zu bekommen, klingt für mich falsch
Leo

46

Dies kann auch mit String.format () erreicht werden. Dies ist möglicherweise einfacher und / oder flexibler, wenn Sie mehrere Zahlen in einer Zeichenfolge formatieren.

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

Für die Formatzeichenfolge "%, 2f" - "bedeutet" separate Zifferngruppen mit Kommas, und ".2" bedeutet auf zwei Stellen nach der Dezimalstelle runden.

Weitere Informationen zu anderen Formatierungsoptionen finden Sie unter https://docs.oracle.com/javase/tutorial/java/data/numberformat.html


42

Sobald Sie Ihren String in eine Zahl umgewandelt haben, können Sie ihn verwenden

// format the number for the default locale
NumberFormat.getInstance().format(num)

oder

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)

Wie kann man sowohl das Gebietsschema als auch die Runde auf (sagen wir) 2 Dezimalstellen angeben ?
Jonik

6
Ah, new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
egal

16

Da dies das erste Google-Ergebnis ist format number commas java, finden Sie hier eine Antwort, die für Personen funktioniert, die mit ganzen Zahlen arbeiten und sich nicht für Dezimalstellen interessieren.

String.format("%,d", 2000000)

Ausgänge:

2,000,000

funktioniert auch für Floats, z. B. printf ("%, f \ n", decimalNumber)
philwalk

12

Ich habe mein eigenes Formatierungsprogramm erstellt. Das ist extrem schnell bei der Verarbeitung der Formatierung und bietet Ihnen viele Funktionen :)

Es unterstützt:

  • Die Komma-Formatierung zB 1234567 wird zu 1.234.567.
  • Präfix mit "Tausend (K), Millionen (M), Milliarden (B), Billionen (T)".
  • Präzision von 0 bis 15.
  • Präzise Größenänderung (Bedeutet, wenn Sie eine 6-stellige Präzision wünschen, aber nur 3 verfügbare Ziffern haben, wird diese auf 3 erzwungen).
  • Präfixsenkung (Bedeutet, wenn das von Ihnen gewählte Präfix zu groß ist, wird es auf ein geeigneteres Präfix gesenkt).

Den Code finden Sie hier . Sie nennen es so:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

Ich sollte auch darauf hinweisen, dass dies keine Dezimalunterstützung behandelt, aber für ganzzahlige Werte sehr nützlich ist. Das obige Beispiel würde "1,23 M" als Ausgabe zeigen. Ich könnte wahrscheinlich Dezimalunterstützung hinzufügen, habe aber seitdem nicht allzu viel Verwendung dafür gesehen. Ich könnte dies genauso gut zu einer Klasse vom Typ BigInteger zusammenführen, die komprimierte char [] -Arrays für mathematische Berechnungen verarbeitet.


2
Dies ist gut, wenn Sie nur in englischer Sprache arbeiten. Mein Vorschlag ist, so etwas wie das Abendessen meiner nicht englischen Benutzer zu vermeiden, da sie nicht verstehen konnten, was Koder Mwas
rishabhmhjn

@rishabhmhjn aber ... könntest du es nicht einfach optimieren, um es an einen Buchstaben anzupassen, den du brauchst? Ist dein Pech seine Schuld? : o und was er erstellt hat, ist ziemlich cool, obwohl der Link momentan nicht verfügbar zu sein scheint.
Aquarius Power

@AquariusPower Das Problem ist beispielsweise, dass japanische Zahlen nicht dem metrischen System folgen. Ihre Zahlen sind 1 百 für 100, 1 千 für 1000, 1 万 für 10000, dann wird es 1 千万 für 1000.0000. Mein Team arbeitete an etwas Ähnlichem in Javascript. Sie können die in diesem
Fall

Ich habe meinen alten Code dafür gefunden und ihn erneut auf GitHub hochgeladen. Der Link im Kommentar wurde aktualisiert.
Jeremy Trifilo

6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}

6

Sie können auch die folgende Lösung verwenden -

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}

4

Sie können die gesamte Konvertierung in einer Zeile mit dem folgenden Code durchführen:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

Die letzten beiden # -Zeichen im DecimalFormat-Konstruktor können auch Nullen sein. So oder so funktioniert.


3

Die erste Antwort funktioniert sehr gut, aber für ZERO / 0 wird sie als .00 formatiert

Daher funktioniert das Format #, ## 0.00 gut für mich. Testen Sie immer verschiedene Zahlen wie 0/100 / 2334.30 und negative Zahlen, bevor Sie sie auf dem Produktionssystem bereitstellen.


3

Hier ist der einfachste Weg dorthin:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

Ausgabe: 10.987.655,88

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.