2012-09-24 18 views
12

Hola Tengo problemas para convertir un formato largo (centavos) en moneda.Java Conversión larga en moneda

Mi Código:

long doublePayment = 1099; //Should equal $10.99 
DecimalFormat dFormat = new DecimalFormat(); 
String formattedString = dFormat.format(doublePayment); 
System.out.println(formattedString); 

de salida: 1099

También probé:

long doublePayment = 1099; 
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(doublePayment); 
System.out.println(s); 

Dado que se trata centavos, la salida debe ser 10.99 o $ 10.99.

No puedo entender lo que estoy haciendo mal. ¡¡¡Gracias!!!

+0

Vaya, lo siento, no sé por qué mi código no entró en "CodeFormat", lo siento mucho de antemano. – mcd

+0

Porque necesita una nueva línea antes del código; Lo arreglé por ti. – Jesper

+1

Para su información, debe usar BigDecimal para la moneda: http://stackoverflow.com/questions/285680/representing-monetary-values-in-java – wulfgarpro

Respuesta

18

Convertir centavos a dólares se puede utilizar

long doublePayment = 1099; 
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(doublePayment/100.0); 
System.out.println(s); 

Ésta será una precisión de hasta $ 70 billones de dólares.

+0

Gracias por la ayuda – mcd

+0

He intentado lo que pensé que era esto antes, pero puse "x/100" ni siquiera pensando que es diferente de "x/100.0" – mcd

+1

Sí, un entero dividido por un entero le da un número entero. Debería darte un doble realmente que puedes convertir a un entero para la división entera, pero necesitas tener al menos un doble/entero o un entero/doble para obtener un doble. –

0

double doublePayment = 10.99; Debe proporcionar moneda como esta. NumberFormat no entenderá si lo está proporcionando en centavos o $ a menos que vea el punto decimal

0

No es un problema con el formateo, es un problema con la entrada. Divide tu entrada entre 100 y estarás listo.

float payment = 1099/((float) 100); 
+0

Usaría el doble en lugar de flotar, ya que habrá menos error de representación. es decir 'doble pago = 1099/100.0;' –

0

Uso formateador divisa:

NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.ENGLISH); 
String output = nf.format(value); 
System.out.println(value + " " + output); 
6

Su literal es 1099, que es mil y noventa y nueve, hacer frente a las normas de Java para literales enteros. De acuerdo con la configuración regional de JVM, este número se representa con 1,099. Si estuvieras en Europa, sería 1.099. Por lo tanto, no es un problema con su salida , pero con su entrada .

El problema es que usted tiene que representar un valor fijo punto, pero no se sabe java.math.BigDecimal y tratar de fingir. Las cosas se romperán cuando hagas algunos cálculos. No lo hagas

Esto es lo que se supone que debes hacer. Simplemente (que es mucho menos código, también):

BigDecimal payment = new BigDecimal("10.99"); 
System.out.println(String.format("$%.2f", payment)); 

Nota cómo te initailize un número con una cadena. Además, String.format() se ocupará de of the current locale, o puede suministrar la requerida a través del método sobrecargado.

+3

El caso podría ser que David tiene un valor de centavos largo, luego debe usar el nuevo BigDecimal (doublePayment) .movePointLeft (2); – Lauri

22

En caso de que tenga mucho tiempo para empezar, todavía debe usar java.math.BigDecimal.

long doublePayment = 1099; 
    BigDecimal payment = new BigDecimal(doublePayment).movePointLeft(2); 
    System.out.println("$" + payment); // produces: $10.99 

se diga en voz alta una vez más: Uno nunca debe utilizar variables de coma flotante para almacenar el valor del dinero/moneda.

+1

Excepto que la mayoría de los bancos de inversión usan 'doble'. No hay BigDecimal en C o C++ y, sin embargo, muchos sistemas usan C o C++. ;) –

+3

Supongo que los bancos usan alguna forma entera o larga para almacenar centavos o fracciones de centavos, porque la aritmética de punto flotante produce errores menores, que no están permitidos en los sistemas bancarios. – Lauri

+2

los errores menores no son errores aleatorios. Puede predecir qué tan grandes pueden ser y usar el redondeo apropiado. Usted tiene razón y int también se utilizan, pero estos son menos comunes en mi humilde opinión. Estoy de acuerdo en que si no sabes cómo usar el redondeo apropiado, utiliza BigDecimal. –