Forza il punto (".") Come separatore decimale in java


103

Attualmente utilizzo il seguente codice per stampare un doppio:

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

Funziona bene, tranne per il fatto che Java utilizza il separatore decimale delle mie impostazioni internazionali (una virgola) mentre io vorrei usare un punto. C'è un modo semplice per farlo?


Se hai bisogno di usare il valore double con decimali precisi, forse dovresti usare BigDecimal invece di double / Double. Vedi questo collegamento per i problemi che potresti incontrare quando usi le doppie variabili. Puoi anche provare questo: System.out.println (5.1d + 1.1d); - il risultato sarà 6.199999999999999 invece di 6.2. Penso che qualcuno che sta cercando come formattare i numeri con i decimali come String debba saltare le doppie variabili.
razvanone

Risposte:


172

Usa il sovraccarico di String.formatcui puoi specificare la locale:

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

Se stai solo formattando un numero, come sei qui, allora NumberFormatprobabilmente sarebbe più appropriato usare. Ma se hai bisogno del resto delle capacità di formattazione di String.format, dovrebbe funzionare bene.


6
Locale.ROOT è più neutro.
speedogoo

@speedogoo: modificato, anche se sospetto che per la formattazione del numero non faccia alcuna differenza.
Jon Skeet

1
Sì, ma non è necessario scegliere tra Stati Uniti e Regno Unito. 😜
speedogoo

2
Locale.ROOT è anche al sicuro contro possibili futuri cambiamenti nella scelta del separatore decimale di un paese.
Attila Tanyi

IMO questo non risponde alla domanda, piuttosto Locale.setDefault (new Locale ("en", "US")); fa come indicato in un'altra risposta. È vero che forse ha effetti collaterali indesiderati in quanto è globale, OTH come programmatore quello che voglio veramente è che l'impostazione predefinita globale sia USA perché in qualsiasi altra parte del mio codice in cui mi interessa la localizzazione lo faccio esplicitamente.
nyholku

21

Una soluzione più drastica consiste nell'impostare la tua Locale all'inizio del main ().

Piace:

Locale.setDefault(new Locale("en", "US"));

11
Questa è una risposta molto problematica, perché ha un effetto globale, quindi può causare molti altri cambiamenti (possibilmente indesiderabili).
sleske

2
IMO questa è la risposta corretta alla domanda e accanto come programmatore questo è quello che voglio. Voglio che Java utilizzi le impostazioni internazionali statunitensi per impostazione predefinita, poiché ovunque nel mio codice in cui ho effettivamente bisogno della localizzazione, lo renderò esplicito nel mio codice. Forse solo le mie abitudini, ma è molto fastidioso quando printf / format usa le mie impostazioni locali locali perché la virgola decimale è totalmente incompatibile con altri software (Matlab chiunque) che uso.
nyholku

10

È possibile passare una Locale aggiuntiva a java.lang.String.format nonché a java.io.PrintStream.printf (ad esempio 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);
    }

}

Ciò si traduce in quanto segue (sul mio PC):

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

Vedi String.format nell'API Java.


4
È inoltre possibile utilizzare out.printf((Locale)null, ...)o out.format((Locale)null, ...)per ottenere una rappresentazione indipendente dalla locale. (e c'è anche Locale.ROOT)
eckes il

10

Troppo tardi ma come altri menzionati qui è un esempio di utilizzo di NumberFormat(e della sua sottoclasse DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }

Ho la sensazione che la creazione DecimalFormatSymbolse l'impostazione del separatore debba essere eseguita una volta, prima di questo metodo.
Linea

0

È possibile utilizzare NumberFormat e DecimalFormat.

Dai un'occhiata a questo collegamento da Java Tutorials LocaleSpecific Formatting

La sezione intitolata Formattazione sensibile alle impostazioni locali è ciò di cui hai bisogno.


-3

Ho avuto lo stesso problema .. 55.1trasformato in 55,10. La mia soluzione rapida (sporca?) È:

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


1
Funziona solo fino a quando qualcuno cerca di eseguire il codice in una lingua diversa. Non una vera soluzione. -1
Marco Freudenberger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.