2 Stimmen

Javascript parseInt liefert sehr unerwartete Ergebnisse

Mögliches Duplikat:
Workarounds für JavaScript parseInt octal bug

Ich analysiere eine Zeichenkette, um zu prüfen, ob es sich um ein Datum handelt, und durch Zufall haben wir jetzt entdeckt, dass meine Methode nicht für Daten im August oder September funktioniert. Ich mache Folgendes (die Eingabe ist nicht wirklich natürlich hart kodiert, aber der Kürze halber...):

var str = '2010-08-26 14:53';
var data = str.split(' ');  // ['2010-08-26', '14:53']
var date = data[0].split('-'); // ['2010', '08', '26]
var time = data[1].split(':'); // ['14', '53']

var yyyy = parseInt(date[0]); // 2010

// THIS IS WHERE STRANGE THINGS HAPPEN:
var MM = parseInt(date[1]); // 0 - not 08 or 8, as expected!
console.log(date[1]); // prints "08" (with quotes)
console.log(date[1].toString()); // prints 08 (no quotes)
console.log(parseInt(date[1].toString())); // prints 0 (!)

Dieses Problem tritt im August und September sowie am 8. und 9. eines jeden Monats auf, d. h. wenn entweder "08" o "09" wird in eine Ganzzahl geparst, 0 wird zurückgegeben anstelle von 8 o 9 . Der Code funktioniert sowohl für niedrigere (z. B. "07" ) und höher (z. B. "10" ) Ganzzahlen (zumindest innerhalb der erwarteten Datumsbereiche...)

Was mache ich falsch?

9voto

Tomalak Punkte 320467

Verwenden Sie

parseInt(date[1], 10)

um sicherzustellen, dass die Zeichenfolge zur Basis 10 (Dezimalzahl) interpretiert wird.

Andernfalls wird sie als Basis 8 (oktal) interpretiert, wenn sie mit "0" oder zur Basis 16 (hexadezimal), wenn sie mit "0x" .

In der Tat, Sie sollten immer das Argument base einschließen, um diese Art von Fehlern zu vermeiden.

1voto

mck89 Punkte 18347

Das liegt daran, dass Zahlen, die mit 0 beginnen, als Oktalzahlen behandelt werden, und "08" ist keine Oktalzahl, also wird 0 zurückgegeben.

Lesen Sie dies: http://mir.aculo.us/2010/05/12/adventures-in-javascript-number-parsing/

1voto

Sergii Pozharov Punkte 16576

Die Funktion parseInt() hat den zweiten optionalen Parameter radix. Wenn der Radix-Parameter weggelassen wird, geht JavaScript von folgendem aus:

  • Beginnt die Zeichenkette mit "0x", ist das Radix 16 (hexadezimal)
  • Beginnt die Zeichenkette mit "0", ist das Radix 8 (oktal). Diese Funktion ist veraltet
  • Beginnt die Zeichenkette mit einem anderen Wert, ist das Radix 10 (dezimal)

In Ihrem Fall wird also von den Oktalzahlen ausgegangen. Ändern in var MM = parseInt(date[1], 10); und es wird funktionieren

0voto

PaulJWilliams Punkte 18533

Es hört sich so an, als ob Ihr Datum als Hexadezimalwert geparst wird - die führende Null ist dafür verantwortlich.

Da die Hexadezimal- und Dezimaldarstellung für 0-7 gleich sind, "funktioniert" es, aber 8 und 9 werden falsch umgewandelt.

Verwenden Sie

parseInt(date[1], 10)

Um die Basis explizit anzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X