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. Es bieten sich an:
- BigDecimal: Vorteil sind die präzisen Berechungen und die wählbaren Rundungen
- Paar von int long: Getrenntes Speichern der Vor-/Nachkommastellen
Hinweis: Die primitiven Datentypen double und float sind wegen ihrer Unfähigkeit Vielfaches von 0.01 korrekt dazustellen 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, und die Typen sollen eigentlich in Java 9 aufgenommen werden, doch dazu kam es nicht. Dennoch sind die Typen interessant und die Referenzimplementierung Moneta ein Blick wert: http://javamoney.github.io/ri.html. Neben Geldbeträgen erlaubt die kleine Bibliothek auch Umrechungen, Formatierungen und eigene Währungen.
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 |
Einige ISO 4217-Codes
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.
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.
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
…