2011-10-19 13 views
18

Hago lo posible por encontrar una forma de formatear las monedas extranjeras en varias configuraciones regionales que no son las predeterminadas para esa moneda, usando Java. He encontrado java.util.Currency, que puede representar el símbolo adecuado para usar en varios entornos locales. Es decir, para USD, me proporciona el símbolo $ en los EE. UU., Y US $ o USD en otras naciones. Además, he encontrado java.text.NumberFormat, que formateará una moneda para una configuración regional específica. Mi problema: util.Currency proporcionará los símbolos y códigos adecuados para representar las monedas en sus configuraciones regionales no predeterminadas, pero no formateará la moneda de ninguna manera específica de la configuración regional. NumberFormat asume que el número que lo paso, con una configuración regional, es la moneda de esa configuración regional, no es una moneda extranjera.Formateo de monedas en configuraciones regionales extranjeras en Java

Por ejemplo, si uso getCurrencyInstance (Locale.GERMANY) y luego formato (1000) asume que estoy formateando 1000 euro. En realidad, es posible que necesite la representación correcta localizada en alemán (decimal correcto y separador de miles, ya sea para poner el símbolo antes o después de la cantidad) para USD, o Yen o cualquier otra moneda. Lo mejor que he podido obtener hasta ahora es formatear un número usando NumberFormat, luego buscar en la salida caracteres que no sean dígitos y reemplazarlos por símbolos derivados de util.Currency. Sin embargo, esto es muy frágil, y probablemente no lo suficientemente confiable para mis propósitos. Ideas? Cualquier ayuda es muy apreciada.

+0

'1)' es usted para mostrar estos datos en algún lugar de la interfaz gráfica de usuario, '2)' Nunca he probado (códigos ISO Divisa de rellevant) entonces mi pregunta es si has intentado print_out symbol para USD, AUD, SGD tal vez hay un símbolo $, '3)' Sugiero buscar códigos ISO en lugar de mezclar y establecer diferentes configuraciones regionales, por ejemplo desde out_dated http://www.oanda.com/help/currency-iso-code-country pero primero desde google, – mKorbel

+0

Es por esto que no debe almacenar dinero en una primitiva 'por su cuenta': deberían ser parte de una clase que también contiene la moneda que representan (500 USD es _no_ 500 yen). –

+0

¿Viste la respuesta que di debajo? ¿Eso resuelve el problema? – les2

Respuesta

40

Intente utilizar setCurrency en la instancia devuelta por getCurrencyInstance (Locale.GERMANY)

Broken:

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

de salida: 23,00 €

fijo:

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)); 

de salida: 23,00 USD

+1

¡Funciona como un encanto! ¡Gracias! – JPittard

+0

¡Has guardado el código manual! jajaja: D –

+2

Mejor comprobación de la respuesta de Testo Testini a continuación. – les2

22

Yo añadiría a responder desde les2 https://stackoverflow.com/a/7828512/1536382 que creo que el número de dígitos fraccionarios no se ha tomado de la moneda, se debe configurar manualmente, de lo contrario si el cliente (NumberFormat) tiene JAPÓN local y Moneda es EURO o en_US, luego el monto se muestra 'a la' Yen ', sin dígitos de fracción, pero no es el esperado ya que en euros los decimales son relevantes, también para japonés ;-).

Así que el ejemplo les2 podría mejorarse agregando format.setMaximumFractionDigits(usd.getDefaultFractionDigits());, que en ese caso particular del ejemplo no es relevante pero se vuelve relevante usando un número con decimales y Locale.JAPAN como configuración regional para 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)); 

la Salida:

USD23 
USD23.23 

En NumberFormat code algo similar se realiza para la moneda/inicial por defecto del formato, el método DecimalFormat#adjustForCurrencyDefaultFractionDigits llamando. Esta operación no se realiza cuando la moneda se cambia después con NumberFormat.setCurrency

+0

Buena captura. Esto realmente es lo suficientemente tedioso como para exigir ser una biblioteca de utilidad, por ejemplo, moneda común. ¿Existe uno? CurrencyUtils.getFormatter (Configuración regional, moneda) .format (BigDecimal) – les2

+0

Deje esto para cualquier persona que pueda ser mordida por este comportamiento: en Android (específicamente, Samsung Galaxy Note 2 con 4.3), con configuración regional de_CH (Deutsch (Schweiz)), si Obtengo el formateador de moneda predeterminado, y call setCurrency ("CAD"), obtengo el redondeo "sueco". Es decir, un valor de 26.98 se formatea a 27.00! Pero con setCurrency ("USD"), no veo este comportamiento. Llamar a setMaximumFractionDigits() como arriba parece resolver cosas, pero no tiene sentido para mí, ya que tanto CAD como USD usan 2 dígitos fraccionarios por defecto. – gnuf

+0

Esto solo resuelve el problema para la cantidad máxima de dígitos de fracción mostrados. Todo lo demás, como el comportamiento de redondeo y la colocación del símbolo de moneda mantendrá la configuración de la moneda nativa para la configuración regional especificada. – 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

Este es un código completo para el formateador de divisas para algunos países. – 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); 
Cuestiones relacionadas