Punto di forza (“.”) come separatore dei decimali in java

Io attualmente uso il seguente codice per stampare una doppia:

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

Questo funziona bene, tranne che Java usa il mio Locale del separatore decimale (virgola), mentre io vorrei utilizzare un punto. C’è un modo semplice per fare questo?

  • Se è necessario l’uso di un doppio valore, con precise decimali, forse si dovrebbe usare BigDecimal, invece di doppio/Matrimoniale. Vedere link per i problemi che si possono incontrare utilizzando le variabili doppie. Si può anche provare questo: di Sistema.out.println(5.1 d + 1.1 d); – il risultato sarà 6.199999999999999 invece di 6.2. Penso che qualcuno alla ricerca su come formattare i numeri con cifre decimali Stringa deve saltare la doppia variabili.
InformationsquelleAutor dtech | 2011-03-08



6 Replies
  1. 154

    Utilizzare l’overload di Stringa.formato che consente di specificare le impostazioni locali:

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

    Se sei solo formattazione di un numero – voi siete qui – quindi utilizzando NumberFormat probabilmente sarebbe più appropriato. Ma se avete bisogno di il resto delle funzionalità di formattazione di String.format, questo dovrebbe funzionare bene.

    • Locale.La RADICE è più neutro.
    • Cura, anche se ho il sospetto che per la formattazione dei numeri non fa alcuna differenza.
    • Sì, ma non c’è bisogno di scegliere tra NOI e il regno UNITO. 😜
    • Locale.RADICE è anche cassetta di sicurezza contro i possibili cambiamenti futuri in un paese a scelta del separatore decimale.
    • IMO questo non risponde alla domanda, piuttosto che Locale.setDefault(nuovo Locale(“it”, “NOI”)); non come ha sottolineato in un’altra risposta. Vero che forse hanno effetti collaterali indesiderati, come è globale, OTH come programmatore, quello che voglio è che il valore predefinito globale è in NOI, perché ovunque nel mio codice dove faccio assistenza su locale che faccio in modo esplicito.
    • Penso che la risposta alla domanda, come chiesto, ad essere onesti. L’impostazione predefinita e quindi fare affidamento su di esso può essere rischioso, altro potrebbe quindi impostare il valore predefinito per qualcos’altro. Preferisco essere esplicito ovunque materia (proprio come faccio con le codifiche e i fusi orari). Certo, ci sono diversi modi per raggiungere l’obiettivo di formattazione di un valore con uno specifico locale – ma la risposta qui uno di loro, anche se non è quello che si preferisce.
    • Beh, IMO, strettamente parlando, non rispondere alla domanda.Il modo in cui ho letto la domanda non è “come fare Java usare il punto come separatore decimale”. La questione non è (non era “come modificare il mio codice per fare il mio codice di usare il punto come separatore dei decimali”. È bene conoscere i possibili rischi e informare i lettori su di esso … OTH qualsiasi codice di produzione che si basa sul valore di default è difettoso, comunque, dato che ho appena scoperto quando ho aggiornato un progetto da Java 7 di Java 11 e scoperto che è stato modificato in qualche punto.
    • Penso che saremo d’accordo, a questo punto. Originale asker è chiaramente abbastanza felice che ha risposto loro questione di accettare la risposta. Potrebbe non essere la risposta lei preferisco, ma questa è un’altra questione.
    • Sono felice di essere in disaccordo su questo. Ho anche d’accordo con la tua valutazione implicita che le mie preferenze grava la mia obiettività meteo che questo risponda alla domanda o non. Il fatto che l’originale asker è felice è IMO non è un’indicazione che la risposta non risponde alla domanda. Un caso per tutti: l’IMO risposta giusta è stato pubblicato, tre settimane dopo aver accettato di rispondere in modo non immettere il concorso di bellezza. Per effettuare una corretta valutazione del meteo di domanda e risposta, partita che si deve guardare solo al testo della domanda e della risposta, e nient’altro.

  2. 18

    Una soluzione più drastica è quella di impostare le impostazioni Internazionali presto nel main().

    Come:

    Locale.setDefault(new Locale("en", "US"));
    • Questo è un molto problematico rispondere, perché ha un effetto globale, così può causare un sacco di altri (possibilmente indesiderati) modifiche.
    • IMO questa è la risposta corretta alla domanda e accanto come programmatore, questo è quello che voglio. Voglio Java per l’utilizzo con NOI il locale per impostazione predefinita, come ovunque nel mio codice in cui ho effettivamente bisogno localizzazione farò esplicito nel mio codice. Solo le mie abitudini, forse, ma è molto fastidioso quando printf/formato usa il mio locale Locale causare quindi decimale ‘virgola’ è totalmente incompatibile con altri software (Matlab chiunque) che uso io.
  3. 10

    Si può passare un ulteriore Locale di java.lang.Stringa.formato di java.io.PrintStream.printf (ad es. Sistema.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);
        }
    
    }

    Questo risultato è il seguente (sul mio PC):

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

    Vedere Stringa.formato in Java API.

    • È inoltre possibile utilizzare out.printf((Locale)null, ...) o out.format((Locale)null, ...) per ottenere un locale indipendente di rappresentanza. (e c’è anche Locale.ROOT)
  4. 9

    Troppo tardi, ma come altri qui citato è un esempio di utilizzo di NumberFormat (e la 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 di DecimalFormatSymbols e impostando il separatore deve essere fatto una volta, prima di questo metodo.
  5. -3

    Ho avuto lo stesso problema.. 55.1 trasformato 55,10.
    Il mio rapido (sporco?) correzione :

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

    • Che funziona solo fino a quando qualcuno tenta di eseguire il codice in un altro locale. Non è una vera soluzione. -1

Lascia un commento