Konvertieren der Währung verschiedener Länder mit java

8

Ich habe einmal ein Szenario wo ich die Währungen als String bekomme, zB:

$ 199,00

R $ 399,00

£ 25,00

90,83 €

AED 449,00

Wie konvertiere ich diese Währungen zu Double in Java?

    
user2649233 02.06.2014, 09:02
quelle

4 Antworten

12

Verwenden Sie niemals double zur Darstellung exakter Mengen

Nun, natürlich können Sie das tun, aber Sie müssen Fließkomma-Arithmetik wirklich verstehen

Verwende ein NumberFormat . Während es einige Währungen behandelt, ist es normalerweise einfacher, alle Währungssymbole zu entfernen. Die NumberFormat verwendet Locale , um die zu verwendenden Trennzeichen zu berechnen:

%Vor%

Dies ist ein String der Menge und der Locale . Es erstellt dann eine Instanz BigDecimal parsing NumberFormat . Es verwendet replaceAll und Regex, um alle außer den Ziffern, . und , von der Zahl zu entfernen, und analysiert sie dann.

Eine kurze Demo gegen Ihre Beispiele:

%Vor%

Ausgabe:

%Vor%

Ich habe einfach US verwendet, wobei die Dezimalstelle . und FRANCE ist, wobei die Dezimalstelle , ist, aber Sie können auch die korrekte Locale für die Währung verwenden, wenn Sie möchten.

    
Boris the Spider 02.06.2014, 09:32
quelle
3

Wie David Wallace sagte, tun Sie es nicht (oder wenn Sie es tun, tun Sie es sehr genau und nur, wenn Sie tief über die Probleme informiert sind), weil double normalerweise nicht geeignet ist mit Währungswerten. Es hat Probleme wie 0.1 + 0.2 endet als 0.30000000000000004 (und andere solche). BigDecimal richtig verwendet ist wahrscheinlich besser geeignet, obwohl dramatisch langsamer. (Mehr zu "richtig verwendet" unten.)

Zuerst müssen Sie bestimmen, welche Tausender- und Dezimaltrennzeichen verwendet werden, aus dem Gebietsschema ( siehe Boris 'exzellente Antwort für weitere Informationen) das ) oder indem Sie diese Informationen zusammen mit der Zeichenfolge zur Verfügung stellen. In einigen Kulturen sind sie , (Tausende) und . (dezimal), z. "1.000.24", aber in anderen Kulturen ist es umgekehrt (z. B. "1.000,24"). Soweit ich weiß, werden an einigen Stellen andere Zeichen verwendet. (Sie können das nicht aus der Zeichenkette erraten, Sie haben keine Ahnung, ob "1,234" eintausendzweihundertvierunddreißig oder ein Punkt zwei drei vierundvierzig bedeutet.)

Sobald Sie wissen, was sie sind, möchten Sie die Tausendertrennzeichen entfernen, das Dezimalzeichen in . (speziell) konvertieren und dann alle Nicht-Ziffern-, Nicht-Minus- und Nicht-Dezimalstellen aus der Zeichenfolge entfernen:

%Vor%

Dann konstruiere dein BigDecimal :

%Vor%

... und setzen Sie die Skalierung und Rundungsmodus passend zu Ihrem Programm. Lesen Sie auch den Javadoc sorgfältig für die verschiedenen Arbeitsmethoden. Zum Beispiel, wie Peter Lawrey in den Kommentaren darauf hingewiesen hat, gibt eine naive Verwendung von BigDecimal Ihnen Laufzeitausnahmen:

%Vor%

Sie können mit diesen umgehen, indem Sie Rundungsinformationen bereitstellen:

%Vor%

... aber stellen Sie sicher, dass Sie eine für Ihre Arbeit geeignete Skalierung festlegen. Zum Beispiel, wenn Ihre Waage nur 2 ist, dann wird (43 / 7) * 7 mit RoundingMode.HALF_UP 42.98 statt 43 sein. Das Teilen ist besonders schwierig, Sie benötigen möglicherweise eine signifikante Skalierung und dann eine abschließende Rundung zurück zu den normaleren Währungsskalen (normalerweise 2, aber manchmal möchten Sie vielleicht mehr Stellen auf der rechten Seite als das).

Wenn Sie wirklich, wirklich, wirklich ein double wollen, verwenden Sie Double.parseDouble :

%Vor%     
T.J. Crowder 02.06.2014 09:05
quelle
0

Verwenden enthält, ersetzen und valueOf

%Vor%     
SteveL 02.06.2014 09:05
quelle
0

Ein einfacherer Weg ist die Verwendung von DecimalFormal wie im folgenden Beispiel:

%Vor%     
Johannes Papo 21.01.2017 21:05
quelle

Tags und Links