2012-09-24 13 views
12

Hallo Ich habe Probleme, ein langes (Cents) in Währungsformat zu konvertieren.Java Converting long in Währung

Mein Code:

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

Ausgang: 1099

ich auch versucht:

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

Da dieser Cent, sollte die Ausgabe 10.99 10.99 oder $ sein.

Kann nicht herausfinden, was ich falsch mache. Vielen Dank!!!

+0

Oops Entschuldigung, ich weiß nicht, warum mein Code nicht in "CodeFormat" ging, also sorry im Voraus. – mcd

+0

Weil Sie eine neue Zeile vor dem Code benötigen; Ich habe es für dich repariert. – Jesper

+1

FYI, sollten Sie BigDecimal für die Währung verwenden: http://stackoverflow.com/questions/285680/representting-monetary-values-in-java – wulfgarpro

Antwort

18

Um Cent auf Dollar konvertieren Sie

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

Diese auf $ 70 Billionen genaue up werden können.

+0

Danke für die Hilfe – mcd

+0

Ich hatte versucht, was ich dachte, war dies vorher, aber setzen Sie "x/100" nicht einmal denken, dass das anders ist als "x/100.0" – mcd

+1

Ja, eine ganze Zahl durch eine ganze Zahl gibt Ihnen eine ganze Zahl. Es sollte Ihnen wirklich ein Doppel geben, das Sie in eine Ganzzahl für Integer-Division umwandeln können, aber Sie müssen mindestens Double/Integer oder Integer/Double haben, um ein Double zu erhalten. –

0

double doublePayment = 10.99; Sie müssen eine Währung wie diese bereitstellen. NumberFormat wird nicht verstehen, ob Sie es in Cent oder $ zur Verfügung stellen, es sei denn es Dezimalpunkt

0

Es ist kein Problem mit der Formatierung, es ist ein Problem mit der Eingabe. Teilen Sie Ihre Eingabe mit 100 und Sie sind fertig.

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

Ich würde Double statt Float verwenden, da es weniger Darstellungsfehler geben wird. d. h. doppelte Zahlung = 1099/100,0; –

0

Verwenden Währung Formatierer:

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

Ihre wörtliche ist 1099, die tausend und neunundneunzig, mit den Java-Regeln für Ganzzahlliterale fertig zu werden. Entsprechend Ihrem JVM-Gebietsschema wird diese Nummer mit 1,099 dargestellt. Wenn Sie in Europa wären, wäre es 1.099. Es ist also kein Problem mit Ihrem Ausgang, sondern mit Ihrem Eingang.

Das Problem ist, dass Sie einen Fixpunkt Wert darstellen müssen, aber Sie wissen nicht java.math.BigDecimal und versuchen, es zu fälschen. Die Dinge werden gebrochen, wenn Sie einige Berechnungen durchführen. Tu es nicht.

Dies ist, was Sie tun sollen. Einfach (es ist weit weniger Code, auch):

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

Hinweis, wie Sie wirklich eine Zahl mit einem String initailize. Auch String.format() wird sich um of the current locale kümmern, oder Sie können das erforderliche über die überladene Methode liefern.

+3

Fall könnte sein, dass David lange Cents hat, dann sollte er neue BigDecimal (doublePayment) verwenden. movePointLeft (2); – Lauri

22

Falls Sie lange brauchen, sollten Sie immer noch java.math.BigDecimal verwenden.

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

es noch einmal laut ausgesprochen werden Lassen: Man kann nie Geld/Währungswert speichern Floating-Point-Variablen verwenden sollte.

+1

Mit Ausnahme der meisten Investmentbanken verwenden "Doppel". Es gibt kein BigDecimal in C oder C++, und viele Systeme verwenden C oder C++. ;) –

+3

Ich würde annehmen, dass Banken eine ganze oder lange Form verwenden, um Cents oder Bruchteile von Cents zu speichern, weil Fließkomma-Arithmetik kleinere Fehler erzeugt, die in Bankensystemen nicht erlaubt sind. – Lauri

+2

kleinere Fehler sind keine zufälligen Fehler. Sie können vorhersagen, wie groß sie sein können und entsprechende Rundungen verwenden. Du hast Recht lang und Int werden auch benutzt, aber diese sind weniger üblich IMHO. Ich würde zustimmen, wenn Sie nicht wissen, wie Sie entsprechende Rundungen verwenden, dann verwenden Sie BigDecimal. –