Siła punkt („.”) Jako separator dziesiętny w java

105

Obecnie używam następującego kodu, aby wydrukować podwójne:

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

Działa to dobrze, z wyjątkiem tego, że Java używa separatora dziesiętnego mojego Locale (przecinek), podczas gdy ja chciałbym użyć kropki. Czy jest na to łatwy sposób?

dtech
źródło
Jeśli potrzebujesz użyć wartości double z dokładnymi miejscami dziesiętnymi, może powinieneś użyć BigDecimal zamiast double / Double. Zobacz to łącze, aby zapoznać się z problemami, które mogą wystąpić podczas używania zmiennych podwójnych. Możesz także spróbować tego: System.out.println (5.1d + 1.1d); - wynik wyniesie 6,199999999999999 zamiast 6,2. Myślę, że ktoś, kto szuka sposobu formatowania liczb z ułamkami dziesiętnymi jako String, musi pominąć podwójne zmienne.
razvanone

Odpowiedzi:

174

Użyj przeciążenia, String.formatktóre pozwala określić ustawienia regionalne:

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

Jeśli formatujesz tylko liczbę - tak jak tutaj - użycie NumberFormatprawdopodobnie byłoby bardziej odpowiednie. Ale jeśli potrzebujesz pozostałych możliwości formatowania String.format, powinno to działać dobrze.

Jon Skeet
źródło
6
Locale.ROOT jest bardziej neutralny.
speedogoo
@speedogoo: Edytowano, chociaż podejrzewam, że formatowanie liczb nie ma znaczenia.
Jon Skeet,
1
Tak, ale nie musisz wybierać między Stanami Zjednoczonymi a Wielką Brytanią. 😜
speedogoo
2
Locale.ROOT jest również zabezpieczony przed możliwymi przyszłymi zmianami w wyborze separatora dziesiętnego w danym kraju.
Attila Tanyi
IMO to nie odpowiada na pytanie, a raczej Locale.setDefault (new Locale ("en", "US")); robi tak, jak wskazano w innej odpowiedzi. Prawdą jest, że może mieć niepożądane skutki uboczne, ponieważ jest globalne, OTH jako programista naprawdę chcę, aby globalne ustawienie domyślne to US, ponieważ wszędzie w moim kodzie, gdzie zależy mi na ustawieniach regionalnych, robię to wyraźnie.
nyholku
21

Bardziej drastycznym rozwiązaniem jest wczesne ustawienie ustawień regionalnych w main ().

Lubić:

Locale.setDefault(new Locale("en", "US"));
Federico Giorgi
źródło
11
Jest to bardzo problematyczna odpowiedź, ponieważ ma efekt globalny, a więc może spowodować wiele innych (być może niepożądanych) zmian.
sleske
2
IMO to jest prawidłowa odpowiedź na pytanie i oprócz tego jako programista tego właśnie chcę. Chcę, aby Java domyślnie używała ustawień regionalnych dla Stanów Zjednoczonych, tak jak wszędzie w moim kodzie, gdzie faktycznie potrzebuję lokalizacji, zaznaczę to wyraźnie w moim kodzie. Może tylko moje przyzwyczajenia, ale jest to bardzo irytujące, gdy printf / format używa mojego lokalnego, ponieważ przecinek dziesiętny jest całkowicie niekompatybilny z innym oprogramowaniem (każdy Matlab), którego używam.
nyholku
10

Możesz przekazać dodatkowe ustawienia regionalne do java.lang.String.format, a także do java.io.PrintStream.printf (np. System.out.printf ()):

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);
    }

}

Powoduje to (na moim komputerze):

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

Zobacz String.format w Java API.

Simon A. Eugster
źródło
4
Możesz także użyć out.printf((Locale)null, ...)lub, out.format((Locale)null, ...)aby uzyskać niezależną reprezentację lokalną. (i jest też Locale.ROOT)
eckes
10

O wiele za późno, ale jak wspomniano tutaj, jest przykładowe użycie NumberFormat(i jego podklasy DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }
VizGhar
źródło
Mam wrażenie, że stworzenie DecimalFormatSymbolsi ustawienie separatora powinno być zrobione raz, przed tą metodą.
Linia
0

Możesz użyć NumberFormat i DecimalFormat.

Spójrz na to łącze z samouczków Java LocaleSpecific Formatting

Sekcja zatytułowana Formatowanie z uwzględnieniem ustawień regionalnych jest tym, czego potrzebujesz.

blong824
źródło
-3

Miałem ten sam problem ... 55.1przekształcony w 55,10. Moja szybka (brudna?) Poprawka to:

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

Fred '
źródło
1
Działa to tylko do momentu, gdy ktoś spróbuje uruchomić Twój kod w innym języku. Nie jest to prawdziwe rozwiązanie. -1
Marco Freudenberger