Wie ändere ich das Dezimaltrennzeichen von DecimalFormat von Komma zu Punkt / Punkt?

204

Ich habe diese kleine verrückte Methode, die BigDecimal-Werte in schöne und lesbare Strings konvertiert.

private String formatBigDecimal(BigDecimal bd){
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(3);
    df.setMaximumFractionDigits(3);
    df.setMinimumIntegerDigits(1);
    df.setMaximumIntegerDigits(3);
    df.setGroupingSize(20);
    return df.format(bd);
}

Es wird jedoch auch ein sogenanntes Gruppentrennzeichen erzeugt ",", mit dem alle meine Werte wie folgt angezeigt werden:

xxx,xxx

Ich brauche das Trennzeichen als Punkt oder Punkt und nicht als Komma. Hat jemand eine Ahnung, wie man diese kleine Leistung vollbringt?

Ich habe dies und insbesondere dies jetzt zu Tode gelesen, aber ich kann keinen Weg finden, dies zu erreichen. Nähere ich mich dem falsch? Gibt es eine viel elegantere Möglichkeit, dies zu tun? Vielleicht sogar eine Lösung, die unterschiedliche lokale Zahlendarstellungen berücksichtigt, da das Komma nach europäischen Maßstäben perfekt wäre.

MiraFayless
quelle

Antworten:

323

Sie können das Trennzeichen entweder durch Festlegen eines Gebietsschemas oder mithilfe der DecimalFormatSymbols ändern .

Wenn das Gruppentrennzeichen ein Punkt sein soll, können Sie ein europäisches Gebietsschema verwenden:

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;

Alternativ können Sie die DecimalFormatSymbols-Klasse verwenden, um die Symbole zu ändern, die in den von der Formatierungsmethode erzeugten formatierten Zahlen angezeigt werden. Zu diesen Symbolen gehören unter anderem das Dezimaltrennzeichen, das Gruppentrennzeichen, das Minuszeichen und das Prozentzeichen:

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);

currentLocale kann von Locale.getDefault () bezogen werden, dh:

Locale currentLocale = Locale.getDefault();
Chris
quelle
1
Sie können applyPattern auf dem Dezimalformat verwenden, um Ihre .00
krystan Ehre
Ich habe otherSymbols.setDecimalSeparator (',') geändert. as otherSymbols.setDecimalSeparator ('.'); Danke. Es funktioniert bei mir.
Aakanksha
2
So sieht das Format aus, z. B. String formatString = "#,###,###,##0.00";siehe docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html für die Syntax
Vulpo
1
"Sie können ein europäisches Gebietsschema verwenden". Nun, Sie können kein Gebietsschema aus Europa verwenden, da Locale.UKes zurückkehren wird 1,567.90 und nicht 1.567,90
Junior Mayhé
Randnotiz: NumberFormat.getNumberInstance()Kann auf einigen Android 7-Geräten ungewöhnlich langsam laufen. Eine Alternative ist String.format()die, die schnell läuft. Siehe stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE
14

Europa ist ziemlich groß. Ich bin mir nicht sicher, ob sie überall das gleiche Format verwenden. Doch diese oder diese wird Antwort von Hilfe sein.

String text = "1,234567";
NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.GERMANY);
double val = nf_in.parse(text).doubleValue();

NumberFormat nf_out = NumberFormat.getNumberInstance(Locale.UK);
nf_out.setMaximumFractionDigits(3);
String output = nf_out.format(val);

Dh das richtige Gebietsschema verwenden.

Reno
quelle
1
In der Tat, Sir! In Großbritannien ist "£ 1,234.00" zu sehen, während in Frankreich "1 234,00 €" erwartet wird (Gruppentrennzeichen, Dezimaltrennzeichen, Währungssymbol und Währungsposition haben sich geändert).
Vulpo
9
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
Imran Khan
quelle
5

BigDecimal scheint die Einstellungen für das Gebietsschema nicht zu berücksichtigen.

Locale.getDefault(); //returns sl_SI

Das slowenische Gebietsschema sollte ein Dezimalkomma haben. Ich schätze, ich hatte seltsame Missverständnisse in Bezug auf Zahlen.

a = new BigDecimal("1,2") //throws exception
a = new BigDecimal("1.2") //is ok

a.toPlainString() // returns "1.2" always

Ich habe einen Teil meiner Nachricht bearbeitet, der keinen Sinn ergab, da er sich als menschliches Versagen herausstellte (ich habe vergessen, Daten festzuschreiben, und habe das Falsche angeschaut).

Das Gleiche wie BigDecimal kann für alle Java .toString () -Funktionen gesagt werden. Ich denke, das ist in gewisser Hinsicht gut. Serialisierung zum Beispiel oder Debugging. Es gibt eine eindeutige Zeichenfolgendarstellung.

Auch wie andere erwähnt, funktioniert die Verwendung von Formatierern in Ordnung. Verwenden Sie einfach Formatierer, genau wie für das JSF-Frontend. Formatierer erledigen die Arbeit ordnungsgemäß und kennen das Gebietsschema.

Neikius
quelle