String.format () per formattare double in java


178

Come posso usare String.format (formato String, X) per formattare un doppio come segue ???

2354548.235 -> 2.354.548,23

Grazie!

Risposte:


295
String.format("%1$,.2f", myDouble);

String.format utilizza automaticamente le impostazioni internazionali predefinite.


36
Puoi anche usare una locale specifica usandoString.format(Locale.GERMAN, "%1$,.2f", myDouble);
Olivier Grégoire,

13
Se è necessario formattare più di un doppio, utilizzare% 1,% 2 e così via. Ad esempio String.format ("% 1 $ ,. 2f,% 2 $ ,. 2f", myDouble, aDouble)
Moesio

4
Credo che "% 1 $" sia facoltativo in questo caso. Funziona per me con solo "% ,. 2f" come formato String.
Matt Passell,

5
Sì, Matt ha ragione. %1, %2e così via può essere utilizzato per riordinare l'output in base all'indice degli argomenti di input. Vedere questo . È possibile omettere l'indice e l'ordine di formattazione verrà assunto dal formatter.
praneetloke,

1
Dovresti dare una spiegazione del significato delle diverse parti.
Mitulát báti

41
String.format("%4.3f" , x) ;

Significa che abbiamo bisogno di un totale di 4 cifre in ans, di cui 3 dopo il decimale. E f è l'identificatore di formato di double. x indica la variabile per la quale vogliamo trovarla. Ha funzionato per me. . .


1
Penso che significhi che sarà la quarta variabile negli argomenti che seguono e avrà 3 posizioni dopo il decimale.
Michael Fulton,

@MichaelFulton Non è così facile: String.format("%014.3f" , 58.656565)-> 0000000058,657: 14 simboli in totale: 8 zeri e 5 numeri e 1 virgola. Quindi in questo caso il numero 14 indica il numero totale di simboli (quelli extra vengono sostituiti con zero iniziale, potrebbero andare senza, quindi sostituirebbero con lo spazio) nella stringa del risultato . La .3parte è completamente indipendente qui.
parsecer

Tuttavia qui: String.format("%014.3f" , 58.656565)-> 58,657. Lo prendo perché la preferenza va alla .3fparte: prima stampa il numero con 3 cifre decimali e poi se rimangono dei simboli , stampa gli spazi iniziali (o zero / qualunque cosa). In questo caso il numero è 2 + 3 + 1 = 6 simboli e volevamo solo stampare 4, quindi sicuramente non ci sono spazi extra.
parsecer

24

Se vuoi formattarlo con i simboli impostati manualmente, usa questo:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("#,##0.00", decimalFormatSymbols);
System.out.println(decimalFormat.format(1237516.2548)); //1,237,516.25

È preferibile la formattazione basata sulle impostazioni locali.


3
Risposta utile! Tuttavia, l'ultima frase "È preferibile la formattazione basata su locale" non ha senso senza contesto. Ci sono casi d'uso piuttosto buoni in cui NON dovresti usare la formattazione basata su locale, quando vuoi generare un formato specifico della String. Ad esempio, stai implementando l'esportazione dei tuoi dati in un file esterno e vuoi avere il pieno controllo del formato, non dipendente dalla locale corrente (o da qualsiasi).
Honza Zidek,

20

codice estratto da questo link ;

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + 
                   currentLocale.toString());

L'output di questo esempio mostra come il formato dello stesso numero varia con le impostazioni internazionali:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US

13
public class MainClass {
   public static void main(String args[]) {
    System.out.printf("%d %(d %+d %05d\n", 3, -3, 3, 3);

    System.out.printf("Default floating-point format: %f\n", 1234567.123);
    System.out.printf("Floating-point with commas: %,f\n", 1234567.123);
    System.out.printf("Negative floating-point default: %,f\n", -1234567.123);
    System.out.printf("Negative floating-point option: %,(f\n", -1234567.123);

    System.out.printf("Line-up positive and negative values:\n");
    System.out.printf("% ,.2f\n% ,.2f\n", 1234567.123, -1234567.123);
  }
}

E stampa:

3 (3) +3 00003
Formato a virgola mobile predefinito: 1234567,123000
Virgola mobile con virgole: 1.234.567.123000 Default a virgola
mobile negativo: -1.234.567.123000 Opzione a
virgola mobile negativa: (1.234.567, 123000)

Valori positivi e negativi dell'allineamento :
1.234.567,12
-1.234.567,12


2

Ci sono molti modi per farlo. Quelli sono dati sotto:

Supponiamo che il tuo numero originale sia indicato sotto: doppio numero = 2354548.235;

NumberFormatModalità d' uso e arrotondamento

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
    DecimalFormat decimalFormatter = (DecimalFormat) nf;
    decimalFormatter.applyPattern("#,###,###.##");
    decimalFormatter.setRoundingMode(RoundingMode.CEILING);

    String fString = decimalFormatter.format(number);
    System.out.println(fString);

Utilizzo del formattatore di stringhe

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

In tutti i casi il output sarà: 2354548.24

Nota :

Durante l'arrotondamento puoi aggiungere il RoundingModetuo formattatore. Ecco alcuni modi di arrotondamento indicati 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

Uso DecimalFormat

 NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
 DecimalFormat decimalFormatter = (DecimalFormat) nf;
 decimalFormatter.applyPattern("#,###,###.##");
 String fString = decimalFormatter.format(myDouble);
 System.out.println(fString);
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.