Andreas Bleul: Fehlfunktion bei 'eval' und 'parseInt'

Wenn das Argument von eval bzw. parseInt führende Nullen hat, kommt es zu sonderbaren Ergebnissen:

eval('07') und parseInt('07') liefern die Zahl 7 -
wie erwartet.

Bei eval('08') bekommt man 8 , parseInt('08')
liefert jedoch 0...

Und wenn eval('010') bzw. parseInt('010') ausgeführt wird, sind sie sich wieder einig und liefern 8 (!) zurück...selbst eval('010*2') liefert konsequent 16.

Das geschieht sowohl bei IE als auch bei Netscape.

Weiß jemand, wie man den Fehler umschiffen kann ?

Danke,
Andreas

  1. Wenn das Argument von eval bzw. parseInt führende Nullen hat, kommt es zu sonderbaren Ergebnissen:

    die sind nicht sonderbar sondern absolut korrekt

    eval('07') und parseInt('07') liefern die Zahl 7 -
    wie erwartet.

    völlig richtig

    Bei eval('08') bekommt man 8 , parseInt('08')
    liefert jedoch 0...

    auch richtig, gibt es eigentlich nämlich gar nicht

    Und wenn eval('010') bzw. parseInt('010') ausgeführt wird, sind sie sich wieder einig und liefern 8 (!) zurück...selbst eval('010*2') liefert konsequent 16.

    auch richtig

    Das geschieht sowohl bei IE als auch bei Netscape.

    sieha da, die beiden zankhähne sind sich doch nicht etwa einig

    Weiß jemand, wie man den Fehler umschiffen kann ?

    Es ist kein Fehler, sondern eine Funktion.
    Die vorangestellte null signalisiert den Funktionen, dass Du NICHT mit Dezimalzahlen arbeitest, sondern mit Oktalzahlen. Ich hoffe du weißt, was das ist.

    Also was ist passiert:

    07 =  7 absolut richtig
    08 != 8 da hier der Überschlag erfolgen sollte mit:
    010 = 8 nach der 7 kommt die 8 .....
    2*8 = 16 sollte soweit richtig sein

    wie kommst du der sache bei:
    mit eval() fällt mir nix ein,
    aber parseInt(Ausdruck,radix) kennt ein 2. Argument, den radix. Wenn du hier 10 eingibst müsste es wieder klappen(aus Zeitmangel nicht getestet.

    Sieh mal hier nach
    http://www.teamone.de/selfhtml/sfausles/tsfa_tca.htm#a10

    Bye Ed X

    1. Sieh mal hier nach
      http://www.teamone.de/selfhtml/sfausles/tsfa_tca.htm#a10

      Thanx, da steht des Rätsels Lösung !

  2. Guten Tag

    Bei Deinem "Problem" dürfte es sich allem Anschein nach um das Oktalsystem handeln (01234567), ein Relikt aus älteren Zeiten. Heute werden Oktalzahlen durch eine führende Null gekennzeichnet.

    Bei eval('08') bekommt man 8 , parseInt('08')
    liefert jedoch 0...

    eval scheint hier das Oktalsystem nicht zu interpretieren bzw. ist etwas intelligenter als parseInt und bemerkt, daß es sich hier anscheinend um einen String oder eine normale Zahl handelt, da die Zahl so wie sie da steht im Oktalsystem  nicht gültig ist ... parseInt gibt korrekterweise 0 zurück, da die Zahl im Oktalsystem nicht zu finden ist und somit bei "0" Schluß ist.

    Und wenn eval('010') bzw. parseInt('010') ausgeführt wird, sind sie sich wieder einig und liefern 8 (!) zurück...

    Das ist auch gut so. Durch die führende Null gekennzeichnet interpretieren beide die Zahl im Oktalsystem: 1x8 + 0x1 = 8. Für 011 sollte dann konsequenterweise 9 zurückgegeben werden, für 012 10, 013 11 usw.

    selbst eval('010*2') liefert konsequent 16.

    Gut so. 8*2 ist auch 16 :-)

    Das geschieht sowohl bei IE als auch bei Netscape.

    Dann freuen wir uns, daß ausnahmsweise mal beide etwas gleich machen.

    Weiß jemand, wie man den Fehler umschiffen kann ?

    Ist kein Fehler, ist Absicht. Du mußt nur die führende Null loswerden, dann wird es auch nach Deinen Wünschen (dezimal) interpretiert werden.

    Ciao,

    Harry