2011-08-20 7 views
35

Ho un'app che stampa un valore monetario calcolato e voglio visualizzare quel valore con il formato valuta predefinito.Come formattare un valore fluttuante con il formato valuta del dispositivo?

Ad esempio in Europa si può scrivere:

1.000,95 €

Negli Stati Uniti penso che ci si scrive

1,000.95 $

In altre valute ci sono più o meno valori visualizzati per la frazione decimale, negli Stati Uniti sarebbe 2 ma in Giappone sarebbe 0.

Come posso ottenere il più preciso possibile per rmat per tutte le valute esistenti?

risposta

65

Ho trovato la soluzione. La classe NumberFormat ha una moltitudine di formattatori predefiniti. Ce n'è anche uno per la formattazione dei Valori di valuta.

Se si utilizza il metodo statico getCurrencyInstance, la classe restituirà un formattatore per la valuta predefinita del dispositivo. Io uso il seguente codice per impostare il mio risultato:

NumberFormat format = NumberFormat.getCurrencyInstance(); 
((TextView) findViewById(R.id.text_result)).setText(format.format(result)); 
+1

variabile risultato è in quale formato ?? –

+1

cosa succederà nel caso risultato = 1000, e il locale del tuo telefono è FR, ma sei negli Stati Uniti? Scriverà 1 000 € invece di $ 1.000? Il formato della valuta non renderà conto della conversione o il risultato è corretto? –

2

Check out DecimalFormat.

Ha una varietà di funzioni progettate per rendere possibile analizzare e formattare i numeri in qualsiasi paese, incluso il supporto per la Western, arabo, o cifre indiane. Supporta anche diversi tipi di numeri, inclusi numeri interi ("123"), numeri a virgola fissa ("123.4"), notazione scientifica ("1.23E4"), percentuali ("12%"), e importi di valuta ("$ 123"). Tutti questi sapori possono essere facilmente localizzati.

39

Per completezza si supponga di voler visualizzare un prezzo in locale corrente del telefono (corretta indicazione delle cifre decimali e separatore delle migliaia), ma con una valuta di vostra scelta.

NumberFormat format = NumberFormat.getCurrencyInstance(Locale.getDefault()); 
format.setCurrency(Currency.getInstance("CZK")); 
String result = format.format(1234567.89); 

result sarebbe poi tenere questi valori:

  • CZK1,234,567.89 con gli Stati Uniti Locale
  • 1 234 567,89 Kč con locale Ceca

Se vuoi di omettere la parte decimale per i prezzi (mostra $199 invece di $199.00) chiama prima di utilizzare il formattatore:

format.setMinimumFractionDigits(0); 

Tutte le opzioni sono elencate in NumberFormat docs.

+0

Questo link è utile per le impostazioni locali http://stackoverflow.com/questions/4212320/get-the-current-language-in-device?rq=1 –

+0

Nel caso in cui qualcuno abbia problemi nell'ottenere i simboli di valuta corretti, ecco un https alternativo: //stackoverflow.com/questions/9777689/how-to-get-numberformat-instance-from-currency-code –

0

per ottenere locale dispositivo che si potrebbe usare questo:

@TargetApi(Build.VERSION_CODES.N) 
    public static Locale getCurrentLocale(Context c) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
      return c.getResources().getConfiguration().getLocales().get(0); 
     } else { 
      //noinspection deprecation 
      return c.getResources().getConfiguration().locale; 
     } 

e poi fare Formato:

 double num = 1323.526; 

     NumberFormat defaultFormat = NumberFormat.getCurrencyInstance(getCurrentLocale(getContext())); 
     defaultFormat.format(num) 
Problemi correlati