Javascript parseInt donne des résultats très inattendus

Duplication possible:
Solutions de contournement pour JavaScript parseInt octal bug

Je suis en train d'analyser une chaîne pour vérifier si c'est une date et, par hasard, nous avons découvert que ma méthode ne fonctionne pas pour les dates d'août ou de septembre. C'est ce que je fais (l'entrée n'est pas vraiment codée, évidemment, mais pour une brièveté …):

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 (!) 

Ce problème se pose pour le mois d'août et le septembre, et pour les 8ème et 9ème mois, c'est-à-dire lorsque "08" ou "09" est analysé en entier, 0 est renvoyé au lieu de 8 ou 9 . Le code fonctionne pour les nombres entiers inférieurs (p. Ex. "07" ) et supérieurs (par exemple, "10" ) (au moins dans les dates prévues …)

Qu'est-ce que je fais mal?

Utilisation

 parseInt(date[1], 10) 

Pour s'assurer que la chaîne est interprétée comme base 10 (décimale).

Sinon, il est interprété comme base 8 (octal) si elle commence par "0" ou comme base 16 (hexadécimal) si elle commence par "0x" .

En fait, vous devez toujours inclure l'argument de base pour éviter ces types de bugs.

C'est parce que les nombres qui commencent par 0 sont traités comme des nombres octals et "08" n'est pas un octal, donc 0 est retourné.

Lisez ceci: http://mir.aculo.us/2010/05/12/adventures-in-javascript-number-parsing/

La fonction parseInt () possède le deuxième paramètre de radix optionnel. Si le paramètre radix est omis, JavaScript suppose ce qui suit:

  • Si la chaîne commence par "0x", la base est 16 (hexadécimale)
  • Si la chaîne commence par "0", la base est 8 (octal). Cette fonctionnalité est obsolète
  • Si la chaîne commence avec n'importe quelle autre valeur, la base est 10 (décimale)

Donc, dans votre cas, il assume les nombres octals. Modifiez à var MM = parseInt(date[1], 10); Et cela fonctionnera

Il semble que votre date soit analysée en hexadécimal – le zéro en tête fait cela.

Étant donné que les représentations hexagonales et décimales sont les mêmes pour 0-7, cela "fonctionne", mais 8 et 9 sont incorrectement convertis.

Utilisation

 parseInt(date[1], 10) 

Pour spécifier explicitement la base.