Javascript-Mysterien
27. Juni 2005 von Wolfgang SommergutIch habe vor einiger Zeit eine einfache HTML-Eingabemaske gebaut, in der ein Javascript den Wert des eingetippten Datums (im Format mm/jj) validieren soll. Es nutzt die Funktion parseInt()
um die beiden ersten Zeichen (also die Monatangabe) in eine Zahl zu konvertieren. Das hat immer funktioniert, doch jetzt fallen Termine für den August an und siehe da: Jetzt streikt das Script! Die Umwandlung von „08“ und „09“ führt zum fehlerhaften Wert 0, für alle anderen Monate klappt es. Und das beste daran: parseInt()
hat bei Firefox und dem Internet Explorer exakt dieselbe Macke! Bei Opera tritt der Bug nicht auf.
Hier die Probe auf das Exempel: Der Vorgabewert 11/05 funkioniert, verändert man ihn auf 08/05 oder 09/05, dann ist das Ergebnis 0.
Kategorie: Tools und Tipps 4 Kommentare »
lustig, bei 8 und 9 ohne vorgestellte 0 geht´s.
Folgendes funktioniert:
parseInt(Ausgabe.value.substr(0,2), 10)
Als zweites Argument übergibst du die Basis. Wenn man das auslässt, versucht parseInt zu tippen. Wenn dabei das erste Argument für parseInt mit 0 beginnt, wird 8 als Basis angenommen. Da es im Oktalsystem nur 0 – 7 gibt, passt das den Browsern nicht. :-)
@Steffen: Gute Erklärung! Die Implementierung der Funktion beim IE und Firefox finde ich trotzdem armselig. Die Voreinstellung für die Basis sollte 10 sein, und wer was anderes will, muss den entsprechenden Parameter verwenden. Aber einfach die Notation der Zeichenkette heranzuziehen, um die Basis festzulegen, finde ich willkürlich und fehlerträchtig.
Dieses Verhalten entspricht dem ECMA-Standard. Der Standard ist in diesem Falle halt leider ein ziemlicher Scheiss.
Die ECMAScript Language Specification sagt zu parseInt (Punkt 15.1.2.2) u. a. „If the length of S is at least 1 and the first character of S is “0â€, then at the implementation’s discretion either let R = 8 or leave R unchanged.“ (S = string, R = radix).
Da den Spezifikatoren das anscheinend selbst etwas Spanisch vorgekommen ist, haben sie noch folgenden Zusatz verfasst:
When radix is 0 or undefined and the string’s number begins with a 0 digit not followed by an x or X, then the implementation may, at its discretion, interpret the number either as being octal or as being decimal. Implementations are encouraged to interpret numbers in this case as being decimal.
Offensichtlich haben sich aber Microsoft und Firefox davon nicht „ermutigt“ gefühlt.