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.

Lustige Zeit
quelle
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.

Andreas Dolk
quelle
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

Syloc
quelle
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()));
adarshr
quelle
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"
Dellasavia
quelle
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
Waqas Ahmed
quelle
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);
Toter Programmierer
quelle
4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);
Gab
quelle
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);

Amio.io
quelle
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));
akelec
quelle
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
0xjacobb
quelle
1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20


Kadir Erturk
quelle
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