2012-09-24 8 views
12

Witam Mam problem z konwersją długich (centów) na format walutowy.Java Konwersja na długo w walucie

mój kod:

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

wyjściowa: 1099

Próbowałem również:

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

Ponieważ jest centów, wyjście powinno być 10,99 lub 10.99 $.

Nie rozumiem, co robię źle. Dzięki!!!

+0

Oops sorry Niestety nie wiem, dlaczego mój kod nie wszedł do "CodeFormat", więc przepraszam z góry. – mcd

+0

Ponieważ potrzebujesz kodu przed kodem; Naprawiłem to dla ciebie. – Jesper

+1

FYI, powinieneś używać BigDecimal dla waluty: http://stackoverflow.com/questions/285680/representing-monetary-values-in-java – wulfgarpro

Odpowiedz

18

Aby przekonwertować centy na dolary można użyć

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

To będzie dokładne aż do $ 70 bilionów dolarów.

+0

Dzięki za pomoc – mcd

+0

Próbowałem, co myślałem, że wcześniej, ale umieścić "x/100", nie myśląc, że jest inny niż "x/100.0" – mcd

+1

Tak, liczba całkowita podzielona przez liczbę całkowitą daje liczbę całkowitą. Powinien dać ci podwójne podwojone, które możesz rzucić na liczbę całkowitą dla dzielenia całkowitoliczbowego, ale musisz mieć co najmniej podwójne/całkowite lub całkowite/podwójne, aby uzyskać podwójne. –

0

double doublePayment = 10.99; Musisz podać walutę w ten sposób. NumberFormat nie będzie wiedział, czy podajesz go w centach, czy w USD, chyba że wyświetli się przecinek dziesiętny

0

To nie jest problem z formatowaniem, to problem z wprowadzeniem. Podziel swoje dane wejściowe na 100, a wszystko będzie gotowe.

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

Używałbym raczej podwójnego niż swobodnego, ponieważ będzie mniejszy błąd reprezentacji. tj. "podwójna płatność = 1099/100,0;' –

0

Stosowanie waluty formater:

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

Twój dosłowny jest 1099, który jest tysiąc dziewięćdziesiąt dziewięć, radzenie sobie z zasadami Java dla literałów całkowitych. Zgodnie z ustawieniami regionalnymi JVM numer ten jest reprezentowany przez 1,099. Gdybyś był w Europie, byłby to 1.099. Więc nie jest to problem z twoim wyjściowym, ale z twoim wejściem.

Problem polega na tym, że musisz podać stałą wartość o wartości, ale nie wiesz, java.math.BigDecimal i próbujesz ją sfałszować. Sprawy się zepsują, kiedy wykonasz jakieś obliczenia. Nie rób tego.

Oto, co powinieneś zrobić. Po prostu (to znacznie mniej kodu, zbyt):

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

Uwaga jak naprawdę initailize się numer z String. Ponadto, String.format() zajmie się of the current locale, lub możesz dostarczyć wymaganą przez przeładowaną metodę.

+3

Możliwe, że David ma długą wartość centów, wtedy powinien użyć nowego BigDecimal (doublePayment) .movePointLeft (2); – Lauri

22

Jeśli masz dużo czasu na rozpoczęcie, nadal powinieneś używać java.math.BigDecimal.

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

niech to będzie po raz kolejny powiedział głośno: Nigdy nie należy używać zmiennych zmiennoprzecinkowych do przechowywania pieniędzy/wartość walut.

+1

Z wyjątkiem większości banków inwestycyjnych używają słowa "podwójny". Nie ma BigDecimal w C lub C++, a jednak wiele systemów używa C lub C++. ;) –

+3

Przypuszczam, że banki używają jakiejś liczby całkowitej lub długiej do przechowywania centów lub frakcji centów, ponieważ arytmetyka zmiennoprzecinkowa generuje drobne błędy, które nie są dozwolone w systemach bankowych. – Lauri

+2

drobne błędy nie są przypadkowymi błędami. Możesz przewidzieć, jak duże mogą być i użyć odpowiedniego zaokrąglenia. Masz rację długo i int są również używane, ale są to mniej popularne IMHO. Zgadzam się, że jeśli nie wiesz, jak używać odpowiedniego zaokrąglenia, użyj BigDecimal. –