27. Juni 2012 | 2 min lesezeit

BigDecimal und seine Eigenarten

Vor kurzem wurde ich auf ein seltsames Verhalten eines unserer Tests aufmerksam gemacht. Dies stellte sich so dar, dass ein Test bei Eingaben von Geldbeträgen bis 999,99 problemlos lief, aber sobald man die Tausendergrenze überschritt, nur noch Fehler produzierte.

Letzten Endes handelte es sich hierbei nur um ein kleines, leicht zu behebendes Problem. Ich halte es aber dennoch für einen Blogeintrag wert, da es einen recht plötzlich treffen kann, in einem Zusammenhang, in dem man vielleicht nicht unbedingt damit rechnet.

Was war also geschehen? Zur internen Repräsentation verwendeten wir an dieser Stelle java.math.BigDecimal, um Rundungsprobleme bei Geldbeträgen zu vermeiden. Auf eine spezielle Währung waren wir hierbei nicht festgelegt, aber gehen wir im Weiteren der Einfachheit halber von Euro/Cent-Beträgen aus. Die Eingangsdaten für den Test erfolgten in Form eines Strings mit deutscher Formatierung (ein Komma zum Abtrennen der Cent-Beträge). Intern wurde allerdings ein englisches Format verwendet (mit einem Punkt statt einem Komma). Verkürzt dargestellt, hatten wir also folgenden Sachverhalt:

Wichtig zu wissen ist an dieser Stelle, dass numFormatEnglish mit DecimalFormat.getInstance(Locale.ENGLISH) initialisiert wurde. Ein Debugging des Tests hat schnell gezeigt, dass bis zur ersten Zeile der Methode alles korrekt abläuft. Das Number Objekt hat den korrekten Wert und prinzipiell wird auch in der zweiten Anweisung ein korrekter String generiert. Bei einer Eingabe von Eintausend Euro hätte er hier den Wert „1,000.00“. An dieser Stelle fängt allerdings das Problem an, denn BigDecimal stört sich an dem Tausender-Trennzeichen. Es wird eine ParseException geworfen.

Wie konnte das Problem nun gelöst werden? Ein einfacher Aufruf von numFormatEnglish.setGroupingUsed(false) behob die Probleme, da so kein Trennzeichen bei den Tausenderstellen mehr gesetzt wurde.


Keine Kommentare

Kontakt

OPEN KNOWLEDGE GmbH

Standort Oldenburg:
Poststraße 1, 26122 Oldenburg

Standort Essen:
II. Hagen 7, 45127 Essen