21.8 Geld und Währung
Zahlen brauchen Kontext. Eine Zahl alleine ist ohne Einheit und Kontext ohne Information, denn ein Zahle beschreibt immer etwas, ein Alter, eine Baumhöhe, ein Umsatz, usw.
21.8.1 Geldbeträge repräsentieren
Für Geldbeträge gibt es in Java keinen eigenen Datentyp, und so kann eine Speicherung je nach Programm immer anders aussehen. Folgende Datentypen bieten sich an:
BigDecimal: Seine Vorteile sind die präzisen Berechnungen und die wählbaren Rundungen.
ein Paar von int bzw. long: getrenntes Speichern der Vor- und Nachkommastellen
int oder long: statt getrennter Euro- und Cent-Beträge wird alles in Cent gespeichert
[»] Hinweis
Die primitiven Datentypen double und float werden wegen ihrer Unfähigkeit, Vielfaches von 0,01 korrekt darzustellen, nicht empfohlen – Rundungsfehler treten schnell auf.
Money and Currency API
Im »JSR 354: Money and Currency API« wird ein eigener Datentyp für Geldbeträge definiert. Die Typen sollten eigentlich in der Java SE aufgenommen werden, doch dazu kam es bisher nicht. Dennoch sind die Typen interessant, und die Referenzimplementierung Moneta ist einen Blick wert: http://javamoney.github.io/ri.html. Neben Geldbeträgen erlaubt die kleine Bibliothek Umrechungen, Formatierungen und eigene Währungen.
21.8.2 ISO 4217
Währungen werden durch Währungscodes beschrieben, und die Definition findet sich in der Norm ISO 4217. Einige ISO-Codes sind:
ISO-4217-Code | Währung/Einheit | Land |
---|---|---|
EUR | Euro | Länder der europäischen Währungsunion |
CNY | Renminbi | China |
DKK | Krone | Dänemark |
GBP | Pfund | Vereinigtes Königreich |
INR | Rupie | Indien |
USD | Dollar | USA, Ecuador … |
XAU | Feinunze Gold |
Die Tabelle lässt am letzten Eintrag erkennen, dass es auch ISO-Codes für Edelmetalle und sogar Fonds gibt. Für jedes Kürzel gibt es ebenfalls einen numerischen Code.
21.8.3 Währungen in Java repräsentieren
Java repräsentiert Währungen durch die Klasse java.util.Currency. Exemplare der Klasse werden durch eine Fabrikmethode getInstance(String currencyCode) erfragt bzw. aus einer Aufzählung ausgewählt.
[zB] Beispiel
Gib alle im System angemeldeten Währungen mit ein paar Informationen aus:
Currency.getAvailableCurrencies().stream()
.sorted( Comparator.comparing( Currency::getCurrencyCode ) )
.forEach( c -> System.out.printf( "%s, %s, %s, %s%n",
c.getCurrencyCode(), c.getSymbol(),
c.getDisplayName(), c.getNumericCode() ) );
Die Ausgabe beginnt so:
ADP, ADP, Andorranische Pesete, 20
AED, AED, VAE-Dirham, 784
AFA, AFA, Afghanische Afghani (1927–2002), 4
AFN, AFN, Afghanischer Afghani, 971
ALL, ALL, Albanischer Lek, 8
...