Erzwinge den Punkt (".") Als Dezimaltrennzeichen in Java

103

Ich verwende derzeit den folgenden Code, um ein Double zu drucken:

return String.format("%.2f", someDouble);

Dies funktioniert gut, außer dass Java das Dezimaltrennzeichen (ein Komma) meines Gebietsschemas verwendet, während ich einen Punkt verwenden möchte. Gibt es eine einfache Möglichkeit, dies zu tun?

dtech
quelle
Wenn Sie den doppelten Wert mit präzisen Dezimalstellen verwenden müssen, sollten Sie möglicherweise BigDecimal anstelle von double / Double verwenden. Unter diesem Link finden Sie Probleme, die bei der Verwendung von Doppelvariablen auftreten können. Sie können dies auch versuchen: System.out.println (5.1d + 1.1d); - Das Ergebnis ist 6.19999999999999999 anstelle von 6.2. Ich denke, dass jemand, der sich mit dem Formatieren von Zahlen mit Dezimalstellen als String befasst, doppelte Variablen überspringen muss.
Rasvanone

Antworten:

172

Verwenden Sie die Überladung, mit String.formatder Sie das Gebietsschema angeben können:

return String.format(Locale.ROOT, "%.2f", someDouble);

Wenn Sie nur eine Nummer formatieren - so wie Sie hier sind -, ist die Verwendung NumberFormatwahrscheinlich besser geeignet. Wenn Sie jedoch den Rest der Formatierungsfunktionen von benötigen String.format, sollte dies problemlos funktionieren.

Jon Skeet
quelle
6
Locale.ROOT ist neutraler.
Speedogoo
@speedogoo: Bearbeitet, obwohl ich vermute, dass die Formatierung von Zahlen keinen Unterschied macht.
Jon Skeet
1
Ja, aber Sie müssen sich nicht zwischen USA und Großbritannien entscheiden. 😜
Speedogoo
2
Locale.ROOT ist auch sicher vor möglichen zukünftigen Änderungen bei der Wahl des Dezimaltrennzeichens eines Landes.
Attila Tanyi
IMO beantwortet dies nicht die Frage, sondern das Locale.setDefault (neues Gebietsschema ("en", "US")); tut, wie in einer anderen Antwort ausgeführt. Es stimmt, dass dies möglicherweise unerwünschte Nebenwirkungen hat, da es global ist. OTH als Programmierer möchte wirklich, dass der globale Standard US ist, da ich dies überall in meinem Code, wo mir das Gebietsschema wichtig ist, explizit mache.
Nyholku
21

Eine drastischere Lösung besteht darin, Ihr Gebietsschema früh in main () festzulegen.

Mögen:

Locale.setDefault(new Locale("en", "US"));
Federico Giorgi
quelle
11
Dies ist eine sehr problematische Antwort, da sie globale Auswirkungen hat und daher viele andere (möglicherweise unerwünschte) Änderungen verursachen kann.
Sleske
2
IMO ist dies die richtige Antwort auf die Frage und nebenbei als Programmierer ist dies das, was ich will. Ich möchte, dass Java standardmäßig das US-Gebietsschema verwendet, da ich es überall in meinem Code, wo ich tatsächlich eine Lokalisierung benötige, in meinem Code explizit mache. Vielleicht nur meine Gewohnheiten, aber es ist sehr ärgerlich, wenn printf / format mein lokales Gebietsschema verwendet, da das dezimale 'Komma' mit anderer Software (Matlab jedermann), die ich verwende, völlig inkompatibel ist.
Nyholku
10

Sie können ein zusätzliches Gebietsschema an java.lang.String.format sowie an java.io.PrintStream.printf (z. B. System.out.printf ()) übergeben:

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

Dies führt zu folgenden Ergebnissen (auf meinem PC):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

Siehe String.format in der Java-API.

Simon A. Eugster
quelle
4
Sie können auch out.printf((Locale)null, ...)oder verwenden out.format((Locale)null, ...), um eine vom Gebietsschema unabhängige Darstellung zu erhalten. (und es gibt auch Locale.ROOT)
eckes
10

Viel zu spät, aber wie hier erwähnt, ist die Beispielverwendung von NumberFormat(und seiner Unterklasse DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }
VizGhar
quelle
Ich habe das Gefühl, dass das Erstellen DecimalFormatSymbolsund Setzen des Trennzeichens vor dieser Methode einmal erfolgen sollte.
Linie
0

Sie können NumberFormat und DecimalFormat verwenden.

Schauen Sie sich diesen Link in den Java Tutorials LocaleSpecific Formatating an

Der Abschnitt mit dem Titel "Gebietsschemasensitive Formatierung" ist genau das, was Sie brauchen.

blong824
quelle
-3

Ich hatte das gleiche Problem .. 55.1verwandelt in 55,10. Meine schnelle (schmutzige?) Lösung lautet:

String.format("%.2f", value).replaceAll(",",".");

fred '
quelle
1
Dies funktioniert nur, bis jemand versucht, Ihren Code in einem anderen Gebietsschema auszuführen. Keine echte Lösung. -1
Marco Freudenberger