Formato numero valuta Java

C’è un modo per formattare un decimale come segue:

100 -> "100" 100.1 -> "100.10" 

Se si tratta di un numero tondo, omettere la parte decimale. In caso contrario, formatta con due cifre decimali.

Ne dubito. Il problema è che 100 non è mai 100 se è un float, normalmente è 99.9999999999 o 100.0000001 o qualcosa del genere.

Se si desidera formattare in questo modo, è necessario definire un epsilon, ovvero una distanza massima da un numero intero e utilizzare la formattazione di numeri interi se la differenza è minore e un valore float in caso contrario.

Qualcosa del genere farebbe il trucco:

 public String formatDecimal(float number) { float epsilon = 0.004f; // 4 tenths of a cent if (Math.abs(Math.round(number) - number) < epsilon) { return String.format("%10.0f", number); // sdb } else { return String.format("%10.2f", number); // dj_segfault } } 

Consiglierei di utilizzare il pacchetto java.text:

 double money = 100.1; NumberFormat formatter = NumberFormat.getCurrencyInstance(); String moneyString = formatter.format(money); System.out.println(moneyString); 

Questo ha il vantaggio di essere specifico per la localizzazione.

Ma se è necessario, troncare la stringa che si ottiene se si tratta di un intero dollaro:

 if (moneyString.endsWith(".00")) { int centsIndex = moneyString.lastIndexOf(".00"); if (centsIndex != -1) { moneyString = moneyString.substring(1, centsIndex); } } 
 double amount =200.0; Locale locale = new Locale("en", "US"); NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale); System.out.println(currencyFormatter.format(amount)); 

o

 double amount =200.0; System.out.println(NumberFormat.getCurrencyInstance(new Locale("en", "US")) .format(amount)); 

Il modo migliore per visualizzare la valuta

Produzione

$ 200,00

Se non si desidera utilizzare il segno, utilizzare questo metodo

 double amount = 200; DecimalFormat twoPlaces = new DecimalFormat("0.00"); System.out.println(twoPlaces.format(amount)); 

200,00

Anche questo può essere utilizzato (con il separatore delle migliaia)

 double amount = 2000000; System.out.println(String.format("%,.2f", amount)); 

2.000.000,00

Non ho trovato alcuna buona soluzione dopo la ricerca di google, basta pubblicare la mia soluzione per altri di riferimento. usa priceToString per formattare i soldi.

 public static String priceWithDecimal (Double price) { DecimalFormat formatter = new DecimalFormat("###,###,###.00"); return formatter.format(price); } public static String priceWithoutDecimal (Double price) { DecimalFormat formatter = new DecimalFormat("###,###,###.##"); return formatter.format(price); } public static String priceToString(Double price) { String toShow = priceWithoutDecimal(price); if (toShow.indexOf(".") > 0) { return priceWithDecimal(price); } else { return priceWithoutDecimal(price); } } 

Sì. È ansible utilizzare java.util.formatter . Puoi usare una stringa di formattazione come “% 10.2f”

Sto usando questo (usando StringUtils da commons-lang):

 Double qty = 1.01; String res = String.format(Locale.GERMANY, "%.2f", qty); String fmt = StringUtils.removeEnd(res, ",00"); 

Devi solo occuparti delle impostazioni locali e della stringa corrispondente da tagliare.

Penso che questo sia semplice e chiaro per la stampa di una valuta:

 DecimalFormat df = new DecimalFormat("$###,###.##"); // or pattern "###,###.##$" System.out.println(df.format(12345.678)); 

produzione: $ 12,345,68

E una delle possibili soluzioni per la domanda:

 public static void twoDecimalsOrOmit(double d) { System.out.println(new DecimalFormat(d%1 == 0 ? "###.##" : "###.00").format(d)); } twoDecimalsOrOmit((double) 100); twoDecimalsOrOmit(100.1); 

Produzione:

100

100.10

dovresti fare qualcosa del genere:

 public static void main(String[] args) { double d1 = 100d; double d2 = 100.1d; print(d1); print(d2); } private static void print(double d) { String s = null; if (Math.round(d) != d) { s = String.format("%.2f", d); } else { s = String.format("%.0f", d); } System.out.println(s); } 

che stampa:

100

100,10

So che questa è una vecchia domanda ma …

 import java.text.*; public class FormatCurrency { public static void main(String[] args) { double price = 123.4567; DecimalFormat df = new DecimalFormat("#.##"); System.out.print(df.format(price)); } } 

Puoi semplicemente fare qualcosa del genere e passare il numero intero e poi i centesimi dopo.

 String.format("$%,d.%02d",wholeNum,change); 

Sono d’accordo con @duffymo che è necessario utilizzare i metodi java.text.NumberFormat per questo tipo di cose. Puoi effettivamente eseguire tutte le formattazioni in modo nativo senza fare alcun confronto con String:

 private String formatPrice(final double priceAsDouble) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); if (Math.round(priceAsDouble * 100) % 100 == 0) { formatter.setMaximumFractionDigits(0); } return formatter.format(priceAsDouble); } 

Un paio di bit da sottolineare:

  • L’intero Math.round(priceAsDouble * 100) % 100 sta semplicemente lavorando attorno alle imprecisioni di doppio / float. Fondamentalmente solo controllando se arriviamo a centinaia di posti (forse questo è un pregiudizio degli Stati Uniti) ci sono altri centesimi.
  • Il trucco per rimuovere i decimali è il metodo setMaximumFractionDigits()

Qualunque sia la logica per determinare se i decimali debbano essere troncati, setMaximumFractionDigits() dovrebbe essere utilizzato.

Di solito avremo bisogno di fare l’inverso, se il tuo denaro json è un float, potrebbe venire come 3.1, 3.15 o solo 3.

In questo caso potrebbe essere necessario arrotondarlo per una visualizzazione corretta (e poter utilizzare una maschera su un campo di input in un secondo momento):

 floatvalue = 200.0; // it may be 200, 200.3 or 200.37, BigDecimal will take care Locale locale = new Locale("en", "US"); NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(locale); BigDecimal valueAsBD = BigDecimal.valueOf(value); valueAsBD.setScale(2, BigDecimal.ROUND_HALF_UP); // add digits to match .00 pattern System.out.println(currencyFormatter.format(amount)); 

Se vuoi lavorare sulle valute, devi usare la class BigDecimal. Il problema è che non c’è modo di memorizzare alcuni numeri float in memoria (ad esempio è ansible memorizzare 5.3456, ma non 5.3455), che può avere effetti nei calcoli errati.

C’è un bell’articolo su come collaborare con BigDecimal e le valute:

http://www.javaworld.com/javaworld/jw-06-2001/jw-0601-cents.html

Formato da 1000000,2 a 1 000 000,20

 private static final DecimalFormat DF = new DecimalFormat(); public static String toCurrency(Double d) { if (d == null || "".equals(d) || "NaN".equals(d)) { return " - "; } BigDecimal bd = new BigDecimal(d); bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP); DecimalFormatSymbols symbols = DF.getDecimalFormatSymbols(); symbols.setGroupingSeparator(' '); String ret = DF.format(bd) + ""; if (ret.indexOf(",") == -1) { ret += ",00"; } if (ret.split(",")[1].length() != 2) { ret += "0"; } return ret; } 

questo modo migliore per farlo.

  public static String formatCurrency(String amount) { DecimalFormat formatter = new DecimalFormat("###,###,##0.00"); return formatter.format(Double.parseDouble(amount)); } 

100 -> “100.00”
100,1 -> “100,10”

Questo post mi ha davvero aiutato a ottenere finalmente quello che voglio. Quindi volevo solo contribuire qui con il mio codice per aiutare gli altri. Ecco il mio codice con qualche spiegazione.

Il seguente codice:

 double moneyWithDecimals = 5.50; double moneyNoDecimals = 5.00; System.out.println(jeroensFormat(moneyWithDecimals)); System.out.println(jeroensFormat(moneyNoDecimals)); 

Sarà di ritorno:

 € 5,- € 5,50 

Il metodo effettivo jeroensFormat ():

 public String jeroensFormat(double money)//Wants to receive value of type double { NumberFormat dutchFormat = NumberFormat.getCurrencyInstance(); money = money; String twoDecimals = dutchFormat.format(money); //Format to string if(tweeDecimalen.matches(".*[.]...[,]00$")){ String zeroDecimals = twoDecimals.substring(0, twoDecimals.length() -3); return zeroDecimals; } if(twoDecimals.endsWith(",00")){ String zeroDecimals = String.format("€ %.0f,-", money); return zeroDecimals; //Return with ,00 replaced to ,- } else{ //If endsWith != ,00 the actual twoDecimals string can be returned return twoDecimals; } } 

Il metodo displayJeroensFormat che chiama il metodo jeroensFormat ()

  public void displayJeroensFormat()//@parameter double: { System.out.println(jeroensFormat(10.5)); //Example for two decimals System.out.println(jeroensFormat(10.95)); //Example for two decimals System.out.println(jeroensFormat(10.00)); //Example for zero decimals System.out.println(jeroensFormat(100.000)); //Example for zero decimals } 

Avrà il seguente risultato:

 € 10,50 € 10,95 € 10,- € 100.000 (In Holland numbers bigger than € 999,- and wit no decimals don't have ,-) 

Questo codice utilizza la valuta corrente. Nel mio caso è Holland, quindi la stringa formattata per me sarà diversa da quella di qualcuno negli Stati Uniti.

  • Olanda: 999.999,99
  • Stati Uniti: 999.999,99

Guarda solo gli ultimi 3 personaggi di quei numeri. Il mio codice ha un’istruzione if per verificare se gli ultimi 3 caratteri sono uguali a “, 00”. Per usarlo negli Stati Uniti potrebbe essere necessario cambiarlo in “.00” se non funziona già.

Questo è quello che ho fatto, utilizzando un numero intero per rappresentare invece la quantità in centesimi:

 public static String format(int moneyInCents) { String format; Number value; if (moneyInCents % 100 == 0) { format = "%d"; value = moneyInCents / 100; } else { format = "%.2f"; value = moneyInCents / 100.0; } return String.format(Locale.US, format, value); } 

Il problema con NumberFormat.getCurrencyInstance() è che a volte vuoi veramente $ 20 per essere $ 20, sembra solo meglio di $ 20,00.

Se qualcuno trova un modo migliore per farlo, usando NumberFormat, sono tutto orecchie.

Ero abbastanza pazzo da scrivere la mia funzione:

Questo convertirà il numero intero in formato valuta (può essere modificato anche per i decimali):

  String getCurrencyFormat(int v){ String toReturn = ""; String s = String.valueOf(v); int length = s.length(); for(int i = length; i >0 ; --i){ toReturn += s.charAt(i - 1); if((i - length - 1) % 3 == 0 && i != 1) toReturn += ','; } return "$" + new StringBuilder(toReturn).reverse().toString(); }