2011-10-19 11 views
18

Sto facendo del mio meglio per trovare un modo per formattare valute straniere su varie impostazioni internazionali che non sono predefinite per quella valuta, utilizzando Java. Ho trovato java.util.Currency, che può rappresentare il simbolo corretto da utilizzare per varie impostazioni internazionali. Cioè, per USD, mi fornisce il simbolo $ negli Stati Uniti e $ USA o USD in altre nazioni. Inoltre, ho trovato java.text.NumberFormat, che formatterà una valuta per una locale specifica. Il mio problema: util.Currency fornirà simboli e codici appropriati per la rappresentazione delle valute nelle loro impostazioni locali non predefinite, ma non formatterà la valuta in alcun modo specifico della locale. NumberFormat presuppone che il numero che ho passato, con una locale, sia la valuta di quella locale, non una valuta straniera.Formattazione di valute in locale straniere in Java

Ad esempio, se utilizzo getCurrencyInstance (Locale.GERMANY) e quindi il formato (1000) presuppone che sto formattando 1000 euro. In realtà, potrei aver bisogno della corretta rappresentazione localizzata in tedesco (decimale corretto e separatore di migliaia, se mettere il simbolo prima o dopo l'importo) per USD, o Yen o qualsiasi altra valuta. Il meglio che ho potuto ricavare finora è formattare un numero usando NumberFormat, quindi cercare l'output per caratteri non numerici e sostituirli con simboli derivati ​​da util.Currency. Tuttavia, questo è molto fragile e probabilmente non abbastanza affidabile per i miei scopi. Idee? Ogni aiuto è molto apprezzato.

+0

'1)' sei di visualizzare questi dati da qualche parte nella GUI, '2)' Non ho mai provato (codici ISO Valuta di rellevant) allora la mia domanda è che hai provato il simbolo print_out per USD, AUD, SGD forse c'è il simbolo $, '3)' Suggerisco di cercare i codici ISO piuttosto che mixare e impostare impostazioni locali diverse, ad esempio da out_dated http:// www.oanda.com/help/currency-iso-code-country ma prima da google, – mKorbel

+0

Le ragioni sono legate al fatto che non dovresti immagazzinare denaro in un primitivo "da soli": dovrebbero far parte di una classe che contiene anche la valuta che rappresentano (500 USD _non_ 500 yen). –

+0

Hai visto la risposta che ho dato qui sotto? Questo risolve il problema? – les2

risposta

40

Prova utilizzando setCurrency nell'istanza restituito da getCurrencyInstance (Locale.GERMANY)

rotto:

java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY); 
System.out.println(format.format(23)); 

uscita: 23,00 €

fisso:

java.util.Currency usd = java.util.Currency.getInstance("USD"); 
java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.GERMANY); 
format.setCurrency(usd); 
System.out.println(format.format(23)); 

uscita: 23,00 USD

+1

Funziona come un fascino! Grazie! – JPittard

+0

Hai salvato dal fare la codifica manuale !!! lol: D –

+2

Checkout migliore Testo Testini risposta qui sotto. – les2

22

vorrei aggiungere a rispondere da les2 https://stackoverflow.com/a/7828512/1536382 che credo che il numero di cifre decimali non è preso dalla moneta, deve essere impostato manualmente, altrimenti se il client (NumberFormat) ha locale GIAPPONE e Valuta è EURO o en_US, quindi l'importo viene visualizzato 'a la' Yen ', senza cifre di frazione, ma questo non è come previsto poiché in euro i decimali sono rilevanti, anche per i giapponesi ;-).

Quindi l'esempio les2 potrebbe essere migliorato aggiungendo format.setMaximumFractionDigits(usd.getDefaultFractionDigits());, che in quel caso particolare dell'esempio non è rilevante ma diventa rilevante utilizzando un numero con decimali e Locale.JAPAN come locale per NumberFormat.

java.util.Currency usd = java.util.Currency.getInstance("USD"); 
    java.text.NumberFormat format = java.text.NumberFormat.getCurrencyInstance(
      java.util.Locale.JAPAN); 
    format.setCurrency(usd); 
    System.out.println(format.format(23.23)); 
    format.setMaximumFractionDigits(usd.getDefaultFractionDigits()); 
    System.out.println(format.format(23.23)); 

uscita volontà:

USD23 
USD23.23 

In NumberFormat code qualcosa di simile è fatto per la moneta/default iniziale del formato, il metodo DecimalFormat#adjustForCurrencyDefaultFractionDigits chiamando. Questa operazione non viene eseguita quando la valuta viene modificata in seguito con NumberFormat.setCurrency

+0

Buona presa. Questo è davvero noioso abbastanza da imporre di essere una libreria di utilità, ad es. Moneta comune. Esiste? CurrencyUtils.getFormatter (Locale, Valuta) .format (BigDecimal) – les2

+0

Lasciando questo per chiunque possa essere morso da questo comportamento: Su Android (in particolare, Samsung Galaxy Note 2 con 4.3), con locale de_CH (Deutsch (Schweiz)), se Ottengo il formattatore di valuta predefinito e chiamata setCurrency ("CAD"), otterrò arrotondamenti "svedesi". Cioè, un valore di 26,98 viene formattato a 27,00! Ma con setCurrency ("USD"), non vedo questo comportamento. Chiamare setMaximumFractionDigits() come sopra sembra risolvere le cose, ma non ha senso per me, dal momento che sia CAD che USD utilizzano 2 cifre frazionarie per impostazione predefinita. – gnuf

+0

Questo risolve solo il problema per il numero massimo di cifre visualizzate. Tutto il resto, come il comportamento di arrotondamento e il posizionamento del simbolo di valuta manterranno le impostazioni della valuta nativa per le impostazioni internazionali specificate. – mpontes

5
import java.util.*; 
import java.text.*; 

public class Solution { 

    public static void main(String[] args) { 
     Scanner scanner = new Scanner(System.in); 
     double payment = scanner.nextDouble(); 
     scanner.close(); 

     NumberFormat lp; //Local Payment 

     lp = NumberFormat.getCurrencyInstance(Locale.US); 
     System.out.println("US: " + lp.format(payment)); 

     lp = NumberFormat.getCurrencyInstance(new Locale("en", "in")); 
     System.out.println("India: " + lp.format(payment)); 

     lp = NumberFormat.getCurrencyInstance(Locale.CHINA); 
     System.out.println("China: " + lp.format(payment)); 

     lp = NumberFormat.getCurrencyInstance(Locale.FRANCE); 
     System.out.println("France: " + lp.format(payment)); 
    } 
} 
+0

Questo è un codice completo per il formattatore di valuta per alcuni paesi. – Ankush

1
Scanner scanner = new Scanner(System.in); 
double payment = scanner.nextDouble(); 
scanner.close(); 
java.text.NumberFormat formatUS = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.US); 
String us=formatUS.format(payment); 
java.text.NumberFormat formatIn = java.text.NumberFormat.getCurrencyInstance(new java.util.Locale("en","in")); 
String india=formatIn.format(payment); 
java.text.NumberFormat formatChina = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.CHINA); 
String china=formatChina.format(payment); 
java.text.NumberFormat formatFrance = java.text.NumberFormat.getCurrencyInstance(java.util.Locale.FRANCE); 
String france=formatFrance.format(payment); 

System.out.println("US: " + us); 
System.out.println("India: " + india); 
System.out.println("China: " + china); 
System.out.println("France: " + france);