2009-11-14 8 views
5

Hay una buena pregunta sobre el redondeo de decimales en Java here. Pero me preguntaba ¿cómo puedo incluir los ceros de la izquierda para mostrar los precios en mi programa como: $ 1,50, $ 1,00¿Cómo mostrar correctamente un precio de hasta dos decimales (centavos) incluyendo los ceros finales en Java?

La solución simple de

String.format("%.2g%n", 0.912385); 

funciona bien, pero omite el cero de fuga si se encuentra en el último lugar decimal. El problema surge en mi programa a pesar de que sólo se utilizan expresiones como esta:

double price = 1.50; 

Cuando hago cálculos con diferentes precios (sumar, multiplicar, etc.) El resultado se muestra principalmente como esto:

$2.5000000000000003 

por lo tanto, utilizando el String.Format funciona bien para este propósito, pero se trunca el ejemplo anterior para

$2.5 

¿hay una manera apropiada para mostrar el cero de crecimiento en el segundo decimal lugar? O los dos ceros si la salida de un cálculo deben ser

$2.00 
+4

Como regla general, nunca use números de coma flotante para representar la moneda. En su lugar, considere usar un número entero para los centavos/peniques. – Pool

Respuesta

18

Yo recomendaría que hacer esto:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(); 
double price = 2.50000000000003; 
System.out.println(currencyFormatter.format(price)); 

Esto tiene la virtud de ser específica para la localización también. Esto funcionará, por ejemplo, si estás en la zona euro en lugar de los EE. UU.

+0

¡Gracias, estaba buscando algo así! No sabía del método getCurrencyInstance(). – denchr

11

Probablemente se puede hacer con String.Format (...), pero se puede usar DecimalFormat:

double price = 2.50000000000003; 
DecimalFormat formatter = new DecimalFormat("$0.00"); 
System.out.println(formatter.format(price)); // print: $2.50 
4

Ha intentado:

String s = String.format("$%.2f", 2.50); 

Eso hará el truco.

+0

Aunque mi respuesta cumple con lo que solicitó, la mejor solución, como han señalado otros, es utilizar 'BigDecimal' o una verdadera clase Money. – dustmachine

14

Mientras que otras respuestas son perfectamente válidas (especialmente la de Duffymo), usted tiene un problema mucho más grande que formatear la pantalla. En realidad está usando un tipo totalmente por un monto de dinero que es valor discreto. En lugar de double, debería considerar usar un java.lang.BigDecimal.

(EDIT: ... o una clase de dinero bien implementado como duffymo señalaron en un comentario, por ejemplo, las clases de módulo de monetary JScience o la más reciente Joda-Money - que todavía tiene que ser lanzado como una versión oficial.)

+0

+1 - punto excelente. Ya sea BigDecimal o una clase Money adecuada. – duffymo

+0

Gracias por la sugerencia. Punto a favor :) – denchr

0
public static String getFormattedData(String actualString) 
    { 
     String subString = "0.0"; 

     if(actualString.contains(".")) 
     { 
      subString = actualString.substring(actualString.indexOf("."), actualString.trim().length()); 

      if(Double.parseDouble(subString) > 0.0) 
       return actualString; 
      else 
       actualString = actualString.substring(0, actualString.indexOf(".")); 
     } 
     return actualString; 
    } 
Cuestiones relacionadas