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?
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:
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.
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:
Dann konstruiere dein BigDecimal
:
... 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:
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
:
Ein einfacherer Weg ist die Verwendung von DecimalFormal wie im folgenden Beispiel:
%Vor%