Doppia formattazione decimale in Java


118

Ho dei problemi con la formattazione dei decimali di un doppio. Se ho un valore doppio, ad esempio 4.0, come formatto i decimali in modo che sia invece 4.00?




Risposte:


218

Uno dei modi sarebbe usare NumberFormat .

NumberFormat formatter = new DecimalFormat("#0.00");     
System.out.println(formatter.format(4.0));

Produzione:

4.00


1
Sì, ma non voglio la virgola, voglio un segno decimale.
Christoffer

Ricevo una virgola. Questo è quello che ho fatto. "double variable; NumberFormat formatter = new DecimalFormat (" # 0.00 "); System.out.println (formatter.format (variable));
Christoffer

l'uscita per quello è X, 00 e non X.00
Christoffer

9
Stai ricevendo una virgola a causa della lingua predefinita utilizzata dalla tua JVM, che è probabilmente diversa da quelle di Nambari. Dai
Michael Zilbermann

1
Come ha sottolineato zim2001, la tua localizzazione potrebbe essere diversa. Leggi il link fornito nella mia risposta. Alla fine troverai informazioni su questo.
kosa

73

Con Java 8, puoi usare il formatmetodo ..: -

System.out.format("%.2f", 4.0); // OR

System.out.printf("%.2f", 4.0); 
  • fè usato per il floatingvalore in punti ..
  • 2 dopo i decimali, il numero di cifre decimali dopo .

Per la maggior parte delle versioni di Java, puoi utilizzare DecimalFormat: -

    DecimalFormat formatter = new DecimalFormat("#0.00");
    double d = 4.0;
    System.out.println(formatter.format(d));

43

Usa String.format :

String.format("%.2f", 4.52135);

Come da documenti:

La locale sempre utilizzata è quella restituita da Locale.getDefault().


8
String.format accetta anche una locale come primo parametro per tenere conto della formattazione del segno decimale.
Vincent Mimoun-Prat

4
Per evitare i segni decimali specifici della locale (come una virgola), specificare la locale US: String.format (Locale.US, "%. 2f", 4.52135);
Alexander233

3
Direi "per usare il punto specifico della località degli Stati Uniti come segno decimale, specificare la località degli Stati Uniti" .. questa idea che le abitudini degli Stati Uniti siano quelle giuste e tutto il resto è roba da "folk" mi fa impazzire.
Simone Gianni

@SimoneGianni Non fare ipotesi stupide, alcune persone potrebbero aver bisogno che il decimale sia un punto. Ad esempio, sto scrivendo una funzione che esporta un documento CSV e non posso avere una virgola perché il carattere virgola è il delimitatore.
Kaiser Keister

19

Usando String.format, puoi farlo:

double price = 52000;
String.format("$%,.2f", price);

Notare la virgola che lo rende diverso dalla risposta di @ Vincent

Produzione:

$52,000.00

Una buona risorsa per la formattazione è la pagina java ufficiale sull'argomento


6

È sempre possibile utilizzare il metodo statico, printf from System.outquindi implementare il formattatore corrispondente; questo consente di risparmiare spazio nell'heap in cui altri esempi richiedevano di fare.

Ex:

System.out.format("%.4f %n", 4.0); 

System.out.printf("%.2f %n", 4.0); 

Risparmia spazio nell'heap, il che è un grande vantaggio, tuttavia ritengo che questo esempio sia molto più gestibile di qualsiasi altra risposta, soprattutto perché la maggior parte dei programmatori conosce la funzione printf da C (Java cambia leggermente la funzione / metodo).


1
@Baz Mi sto perdendo un dettaglio cruciale qui, non è menzionato printStream. L'OP chiede aiuto per la formattazione (che potrebbe essere risolto più facilmente guardando i documenti Java) per il flusso di output standard. Spiegare.
Lewis Robbins

Colpa mia. Stavo guardando la versione javadoc sbagliata (1.4). BTW: outè il file PrintStream.
Baz

@Baz Nessun problema. Sì, ho pensato che fosse la classe a cui ti riferivi, in tutti i miei libri printf è indicato come il metodo statico da System.out (poiché quei metodi sono statici).
Lewis Robbins

1
Per essere esatti, printfè un metodo statico di PrintStream. Vedi qui ;) Ma comunque +1.
Baz

@Baz Dai documenti la classe printStream ha ereditato System.out. Potrei forse sbagliarmi, anche se è abbastanza strano ereditare un metodo statico (è addirittura possibile)? Mi aspetto che tu sia corretto però.
Lewis Robbins

4
double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));


1

Un metodo alternativo è utilizzare il setMinimumFractionDigitsmetodo della NumberFormatclasse.

Qui fondamentalmente specifichi quanti numeri vuoi che appaiano dopo il punto decimale.

Quindi un input di 4.0produrrebbe 4.00, supponendo che l'importo specificato fosse 2.

Ma, se il tuo Doubleinput contiene più dell'importo specificato, ci vorrà l'importo minimo specificato, quindi aggiungi una cifra in più arrotondata per eccesso / per difetto

Ad esempio, 4.15465454con un importo minimo di 2 specificato produrrà4.155

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
Double myVal = 4.15465454;
System.out.println(nf.format(myVal));

Provalo online


1

Ci sono molti modi per farlo. Questi sono riportati di seguito:

Supponiamo che il tuo numero originale sia fornito di seguito:

 double number = 2354548.235;

Utilizzando NumberFormat:

NumberFormat formatter = new DecimalFormat("#0.00");
    System.out.println(formatter.format(number));

Utilizzando String.format:

System.out.println(String.format("%,.2f", number));

Utilizzando DecimalFormat e pattern:

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
        DecimalFormat decimalFormatter = (DecimalFormat) nf;
        decimalFormatter.applyPattern("#,###,###.##");
        String fString = decimalFormatter.format(number);
        System.out.println(fString);

Utilizzo di DecimalFormat e pattern

DecimalFormat decimalFormat = new DecimalFormat("############.##");
        BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
        System.out.println(formattedOutput);

In tutti i casi l' output sarà: 2354548.23

Nota :

Durante l'arrotondamento puoi aggiungere il RoundingModetuo formattatore. Ecco alcune modalità di arrotondamento fornite di seguito:

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

Ecco le importazioni :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

1

Puoi utilizzare uno dei metodi seguenti

  1. Se stai usando java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));

    O

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. Se vuoi convertirlo in un semplice formato stringa

    System.out.println(String.format("%.2f", 4.0)); 

Tutto il codice di cui sopra verrà stampato 4.00


0

Funziona al 100%.

import java.text.DecimalFormat;

public class Formatting {

    public static void main(String[] args) {
        double value = 22.2323242434342;
        // or  value = Math.round(value*100) / 100.0;

        System.out.println("this is before formatting: "+value);
        DecimalFormat df = new DecimalFormat("####0.00");

        System.out.println("Value: " + df.format(value));
    }

}

-3

Prima importazione NumberFormat. Quindi aggiungi questo:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

Questo ti darà due cifre decimali e metterà un segno di dollaro se si tratta di valuta.

import java.text.NumberFormat;
public class Payroll 
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
    int hoursWorked = 80;
    double hourlyPay = 15.52;

    double grossPay = hoursWorked * hourlyPay;
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

    System.out.println("Your gross pay is " + currencyFormatter.format(grossPay));
    }

}

1
La domanda non riguarda la visualizzazione di una valuta e si risponde in modo più accurato utilizzando le funzioni di formattazione (come descritto in altre risposte).
yacc

-4

Puoi farlo come segue:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

1
Non funziona perché usa al ##posto di00
Joaquin Iurchuk,

-4

So che questo è un vecchio argomento, ma se ti piace davvero avere il punto al posto della virgola, salva il tuo risultato come X, 00 in una stringa e poi cambia semplicemente per un punto in modo da ottenere X.00

Il modo più semplice è usare la sostituzione.

String var = "X,00";
String newVar = var.replace(",",".");

L'output sarà l' X.00 che volevi. Inoltre per semplificare puoi fare tutto in uno e salvarlo in una doppia variabile:

Double var = Double.parseDouble(("X,00").replace(",",".");

So che questa risposta non è utile in questo momento, ma forse qualcuno che controlla questo forum cercherà una soluzione rapida come questa.

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.