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?

Sheehan Alam
quelle

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));
NullUserException
quelle
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

Greg H.
quelle
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)
Aaron Novstrup
quelle
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
Ben Watson
quelle
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.

Jeremy Trifilo
quelle
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);
}
user3314142
quelle
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);
}
Jitendra Nath
quelle
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.

Peter Griffin
quelle
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.

Venod Raveendran
quelle
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

John Paker
quelle