Wie setze ich Tausende Trennzeichen in Java?


127

Wie setze ich Tausende Trennzeichen in Java?
Ich habe eine String-Darstellung eines BigDecimal, die ich mit einem Tausendertrennzeichen formatieren und als String zurückgeben möchte.


Erhalten Sie diese Werte von DB?
Toter Programmierer

Antworten:


110

Dies sollte funktionieren (ungetestet, basierend auf JavaDoc):

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Laut JavaDoc sollte die Besetzung in der ersten Zeile für die meisten Gebietsschemas gespeichert sein.


16
Ungetesteter Kommentar dazu: Javadoc für getDecimalFormatSymbols()sagt : Returns: a copy of the desired DecimalFormatSymbols. Daher sollten Sie setDecimalFormatSymbols(theCopy)nach dem Ändern der Kopie verwenden.
java.is.for.desktop

6
In den Dokumenten für bd.longValue () heißt es: "Jeder Bruchteil wird verworfen." Ich weiß also nicht, ob dies der beste Weg ist, wenn Sie
Wert auf

2
Ich denke, Sie könnten es verwenden newund auf Formatierer zurücksetzen: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong

Ich denke, Sie möchten \ u00a0 (nicht unterbrechendes Leerzeichen) als Gruppentrennzeichen verwenden. Dies ist die Standardeinstellung für einige Gebietsschemas.
ACV

3
Warum rufst du longValue an? Die Frage war, Tausende Operatoren für BigDecimal zu setzen, nicht lange.
FINDarkside

231

Sie können die Formatierungsfunktion mit "," verwenden.

int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

"," enthält länderspezifische Gruppierungszeichen.

docs


11
Was ist, wenn ich a .als Trennzeichen verwenden möchte ?
Enissay

Da ich normalerweise String.format verwende, ist es das Beste und Einfachste für mich!
Ali

16
@Enissay Rufen Sie format()mit einem expliziten Gebietsschema auf ( Local.USdas bekanntermaßen ,als Trennzeichen verwendet wird) und ersetzen Sie es ,durch Ihr benutzerdefiniertes Trennzeichen : String.format(Locale.US, "%,d", n).replace(',', '.').
Minipif

java.util.IllegalFormatConversionException:% d kann java.lang.String Argumente nicht formatieren
Iman Marashi

1
@ImanMarashi Cast es zu einem int. Oder a long. Oder a BigInteger. Und verwenden Sie f, wenn Sie verwenden möchten double, floatoder BigDecimal.
Adowrath

55
BigDecimal bd = new BigDecimal(300000);

NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));

System.out.println(formatter.format(bd.longValue()));

BEARBEITEN

Gehen Sie folgendermaßen vor, um ein benutzerdefiniertes Gruppentrennzeichen wie z. B. Leerzeichen zu erhalten:

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setGroupingSeparator(' ');

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));

Ich weiß, dass ich DecimalFormatSymbols setGroupingSeparator verwenden muss, aber ich weiß nicht, wie ich es auf meine BigDecimal
Funtime

1
@Funtime: Sie "wenden es nicht auf Ihr BigDecimal an". Sie erstellen ein NumberFormatObjekt mit den gewünschten Eigenschaften und formatieren damit Ihr Objekt BigDecimal. A hat BigDecimalnur einen bestimmten Wert, es hat kein bestimmtes Format.
Joachim Sauer

1
Beachten Sie, dass das Tausendertrennzeichen im Allgemeinen ein nicht
unterbrechendes

Musste die oberste Zeile in der 2. Option in DecimalFormatSymbols Symbole ändern = new DecimalFormatSymbols (); damit dies funktioniert.
PaperThick

14

Versuchen Sie diesen Code so zu formatieren, wie er in Brasilien verwendet wird:

    DecimalFormat df = new DecimalFormat(
      "#,##0.00", 
      new DecimalFormatSymbols(new Locale("pt", "BR")));

    BigDecimal value = new BigDecimal(123456.00);

    System.out.println(df.format(value.floatValue()));

    // results: "123.456,00"

2
Versuchen Sie dies auch im Fall von JasperReports, indem Sie das richtige Format erzwingen: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); Senden Sie diesen Parameter an den Bericht.
Dellasavia

7

Wenn Sie ein Tausendertrennzeichen für den Datentyp Integer verwenden, verwenden Sie 1.

  1. Für ganzzahligen Datentyp

String.format ("%, d \ n", 58625) und die Ausgabe sind 58.625

  1. Geben Sie für Gleitkommadaten String.format ("%,. 2f", 58625.21) ein und geben Sie 58.625,21 aus

Dies war eine Offenbarung. Sie müssen jedoch wirklich betonen, dass "," nur ein Flag ist, nicht das Zeichen, das es als Gruppentrennzeichen verwendet. (Ich habe einige Zeit
gebraucht

5
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('|');
formatSymbols.setGroupingSeparator(' ');

String strange = "#,##0.###";
DecimalFormat df = new DecimalFormat(strange, formatSymbols);
df.setGroupingSize(4);

String out = df.format(new BigDecimal(300000).doubleValue());

System.out.println(out);

4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);

3

Die akzeptierte Antwort muss wirklich geändert werden, sonst funktioniert sie nicht. Die getDecimalFormatSymbols erstellen eine defensive Kopie. So,

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Die neue Zeile lautet wie folgt: formatter.setDecimalFormatSymbols (Symbole);


2

Für Dezimalstellen :

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
dfDecimal.setDecimalFormatSymbols(symbols);
dfDecimal.setGroupingSize(3);
dfDecimal.setGroupingUsed(true);
System.out.println(dfDecimal.format(number));

1

Wie oben erwähnt, erhalten Sie über den folgenden Link den spezifischen Ländercode, mit dem Java die Nummer lokalisieren kann. Jedes Land hat seinen eigenen Stil.

Unter dem obigen Link finden Sie den Ländercode, der hier eingegeben werden soll:

...(new Locale(<COUNTRY CODE HERE>));

Die Schweiz formatiert die Zahlen beispielsweise wie folgt:

1000.00 -> 1'000.00

Landesvorwahl

Um dies zu erreichen, funktionieren folgende Codes für mich:

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
nf.setMaximumFractionDigits(2);
DecimalFormat df = (DecimalFormat)nf;
System.out.println(df.format(1000.00));

Ergebnis ist wie erwartet:

1'000.00

1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20



Obwohl dieser Code eine Lösung für die Frage bietet, ist es besser, einen Kontext hinzuzufügen, warum / wie er funktioniert. Dies kann zukünftigen Benutzern helfen, zu lernen und dieses Wissen auf ihren eigenen Code anzuwenden. Es ist auch wahrscheinlich, dass Sie positive Rückmeldungen von Benutzern in Form von Upvotes erhalten, wenn der Code erklärt wird.
Borchvm
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.