2009-11-14 6 views
5

Es gibt eine gute Frage zum Runden von Dezimalzahlen in Java here. Aber ich frage mich, wie kann ich die nachfolgenden Nullen enthalten Preise in meinem Programm angezeigt werden wie: $ 1.50, $ 1.00Wie wird ein Preis bis zu zwei Dezimalstellen (Cents) einschließlich abschließender Nullen in Java korrekt angezeigt?

Die einfache Lösung von

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

funktioniert gut, lässt aber die Hinter Null, wenn es an ist die letzte Dezimalstelle. Das Problem kommt in meinem Programm auf, obwohl ich Ausdrücke nur wie folgt verwenden:

double price = 1.50; 

Wenn ich Berechnungen mit unterschiedlichen Preisen (addieren, multiplizieren, etc.) das Ergebnis in erster Linie wie folgt angezeigt:

$2.5000000000000003 

Also, die String.format mit arbeitet zu diesem Zweck in Ordnung, aber es kürzt das obige Beispiel zu

$2.5 

gibt es eine richtige Art und Weise die Hinter Null bei der zweiten Nachkommastelle zu zeigen, Ort? Oder beide Nullen, wenn die Ausgabe einer Berechnung sollte

$2.00 
+4

Als Faustregel sollten Sie niemals Gleitkommazahlen zur Darstellung von Währungen verwenden. Verwenden Sie stattdessen eine Ganzzahl für den Cent/Pence. – Pool

Antwort

18

Ich würde empfehlen, dass Sie dies tun:

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

Dies hat den Vorzug, auch locale spezifisch sein. Dies funktioniert zum Beispiel, wenn Sie in der Eurozone statt in den USA sind.

+0

Danke, ich war auf der Suche nach sowas! Ich kannte die Methode getCurrencyInstance() nicht. – denchr

11

Es kann wahrscheinlich mit String.format (...) getan werden, aber man konnte DecimalFormat verwenden:

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

Haben Sie versucht:

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

Das wird den Trick tun.

+0

Obwohl meine Antwort erfüllt, was Sie angefordert haben, ist die bessere Lösung, wie andere bemerkt haben, "BigDecimal" oder eine wahre Money-Klasse zu verwenden. – dustmachine

14

Während andere Antworten perfekt sind (vor allem Duffymos), haben Sie ein viel größeres Problem als das Formatieren des Displays. Sie verwenden tatsächlich eine völlig falsche Art für einen Geldbetrag, der ein diskreter Wert ist. Anstelle eines double sollten Sie wirklich einen java.lang.BigDecimal verwenden.

(EDIT: ... oder eine gut umgesetzt Geld Klasse als duffymo wies in einem Kommentar, zB Klassen von JScience der monetary Modul oder den neueren Joda-Money - die immer noch als offizielle Version freigegeben werden muss.)

+0

+1 - ausgezeichneter Punkt. Entweder BigDecimal oder eine ordnungsgemäße Money-Klasse. – duffymo

+0

Danke für den Vorschlag. Punkt genommen :) – 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; 
    }