2009-11-14 25 views
5

Il y a une bonne question sur l'arrondissement des nombres décimaux en Java here. Mais je me demandais comment puis-je inclure les zéros de suivi à afficher les prix dans mon programme comme: 1,50 $, 1,00Comment afficher correctement un prix jusqu'à deux décimales (centimes), y compris les zéros de fin en Java?

$ La solution simple

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

fonctionne très bien, mais omet le zéro de fuite si elle est à la dernière décimale. La question est dans mon programme, même si je n'utilise que des expressions comme ceci:

double price = 1.50; 

Quand je fais des calculs avec des prix différents (ajouter, multiplier, etc.), le résultat est principalement affiché comme ceci:

$2.5000000000000003 

Ainsi, en utilisant l'String.format fonctionne très bien à cette fin, mais il tronque l'exemple ci-dessus pour

$2.5 

y at-il une bonne façon de montrer le zéro de fuite à la deuxième décimale endroit? Ou les deux zéros si la sortie d'un calcul doit être

$2.00 
+4

En règle générale, n'utilisez jamais de nombres à virgule flottante pour représenter une monnaie. Au lieu de cela, pensez à utiliser un nombre entier pour les cents/pence. – Pool

Répondre

18

Je recommande que vous faites ceci:

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

Cela a le mérite d'être aussi bien des paramètres régionaux. Cela fonctionnera, par exemple, si vous êtes dans la zone euro au lieu des États-Unis.

+0

Merci, je cherchais quelque chose comme ça! Je ne connaissais pas la méthode getCurrencyInstance(). – denchr

11

Il peut probablement être fait avec String.format (...), mais vous pouvez utiliser DecimalFormat:

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

Avez-vous essayé:

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

Cela fera l'affaire.

+0

Bien que ma réponse accomplisse ce que vous avez demandé, la meilleure solution, comme d'autres l'ont noté, est d'utiliser 'BigDecimal' ou une vraie classe Money. – dustmachine

14

Alors que d'autres réponses sont parfaitement valables (en particulier celles de Duffymo), vous avez un problème beaucoup plus important que le formatage de l'affichage. Vous utilisez actuellement un type totalement mauvais pour un montant d'argent qui est une valeur discrete. Au lieu d'un double, vous devriez vraiment envisager d'utiliser un java.lang.BigDecimal.

(EDIT: ... ou une classe d'argent bien mis en œuvre comme duffymo souligné dans un commentaire, pour les classes par exemple de modules monetary de JScience ou plus récente Joda-Money - qui doit encore être libéré comme une version officielle.)

+0

+1 - excellent point. BigDecimal ou une classe Money appropriée. – duffymo

+0

Merci pour la suggestion. Point pris :) – 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; 
    }