String in Zahl konvertieren — die Tücken von CDbl

Welcher Wert steht nach Ablauf dieses Programmcodes in der Variablen zahl?

Dim zahl As Double
Dim text As String
text = "10,2"
zahl = CDbl(text)

10,2 oder 102? Es ist beides möglich!

Je nach Systemsprache ist etwas anderes als Dezimaltrenner eingestellt. Auf deutscher Plattform ist es das Komma, auf englischer/amerikanischer der Punkt. Außerdem gilt auf deutschem System der Punkt als Tausendertrennzeichen, auf englischem das Komma, also genau umgekehrt. Deshalb kommt auf deutschem System der Wert 10,2 heraus, während auf englischem System das Komma wegen seiner Eigenschaft als Tausendertrennzeichen einfach ignoriert wird, was 102 bringt. Umgekehrt kommt auf deutschem System für CDbl("10.2") der Wert 102 heraus.

Bevor uns vom vielen hier und da und umgekehrt ganz schwindelig wird, was ist nun die Lösung für eine einheitliche Konvertierung in eine Zahl? Angenommen wir haben in einer String-Variablen eine Zahl, von der wir wissen, dass sie als Dezimaltrenner ein Komma und als Tausendertrennzeichen einen Punkt hat. Wir haben den Wert irgendwo ausgelesen, vielleicht aus einer externen Datenquelle, wie auch immer.
Dann können wir so sprachunabhängig konvertieren:

text = Replace(text, ".", "")
text = Replace(text, ",", Application.DecimalSeparator)
zahl = CDbl(text)

Der Tausenderpunkt dient nur dazu, Zahlen besser aussehen zu lassen. Er spielt für die Konvertierung keine Rolle und kann deshalb in einem Replace durch einen leeren String ersetzt, also entfernt, werden. Application.DecimalSeparator gibt an, welches Zeichen als Dezimaltrenner gilt. Durch das zweite Replace wird also das Komma durch jenes Zeichen ersetzt. Wenn das auch ein Komma ist, ändert sich nichts. Danach konvertiert CDbl auf jeden Fall richtig.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.