Ahnungslos oktal
Beim Rechnen mit Formulareingaben erzeugt JavaScript manchmal unerklärliche Fehler. Wie kann das sein?
- Manfred Bertuch
Beim Rechnen mit Formulareingaben erzeugt JavaScript manchmal unerklärliche Fehler. Wie kann das sein?
Formulareingaben sind fĂĽr JavaScript Strings, die in Zahlen umgewandelt werden mĂĽssen, bevor sie zu Berechnungen taugen. Ăśblicherweise kommt dafĂĽr die Funktion parseInt() zum Einsatz, die zum Beispiel den String '15' in die Zahl 15 umwandelt.
Wenig bekannt ist jedoch, dass parseInt() auch Strings in anderen Zahlenformaten akzeptiert. Dafür wertet es ein optionales zweites Argument als Zahlenbasis aus. Die Zahl 15 geben also auch die Anweisungen parseInt('f', 16) (hexadezimal) oder parseInt('17', 8) (oktal) aus. Ohne zweiten Parameter erwartet die Funktion eine Dezimalzahl – normalerweise.
Mitunter glaubt parseInt() aber auch ohne zweiten Parameter andere Zahlenformate zu erkennen. Dank dem für hexadezimale Zahlen typischen Vorspann 0x ermittelt parseInt('0xf') ebenfalls 15 – 'f' allein würde die Funktion dagegen dezimal als „not a number“ auffassen. Für Probleme sorgen Oktalzahlen: Diese glauben nämlich Firefox, Internet Explorer und Safari bereits durch eine oder mehrere vorangestellte Nullen zu erkennen. parseInt('017') ergibt für diese Browser 15, einzig Opera beharrt auf 17. Noch irritierender ist parseInt('08'), das nicht konsequent „not a number“ zurückgibt (die Ziffer 8 existiert ja im Oktalsystem nicht), sondern die Zahl Null.
Ob Opera oder die anderen Browser Recht haben, ist strittig: Die automatische Erkennung von Oktalzahlen gilt seit JavaScript 1.5 als veraltet, aber die JavaScript-Grundlage ECMAScript weiß davon nichts. Vermeiden lassen sich diese Probleme durch eine 10 als zweiten Parameter von parseInt() oder durch implizite Umwandlung: Ausdrücke wie '08' * 1, '08' / 1 oder '08' – 0 fassen die Skript-Engines einhellig als die Zahl 8 auf. (heb)
()