118 votes

Javascript parseInt() avec des zéros en tête

La fonction parseInt de Javascript ne semble pas fonctionner complètement.

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0

Cela ne s'explique pas. Essayez-le. (jsFiddle)

Editer Depuis que cette question a été posée et qu'une réponse y a été apportée, la "fonctionnalité" consistant à utiliser par défaut le radix octal a été supprimée. [ 1 ] [ 2 ]

179voto

Rocket Hazmat Points 87407

En effet, si un nombre commence par un "0", il est traité en base 8 (octal).

Vous pouvez forcer la base en passant la base comme 2ème paramètre.

parseInt("09", 10) // 9

Selon le les docs le deuxième paramètre est facultatif, mais il est pas toujours est supposé être égal à 10, comme vous pouvez le voir dans votre exemple.

39voto

lwburk Points 29313

Appels à parseInt doit toujours spécifier une base dans le deuxième argument :

parseInt("08", 10);

Les versions antérieures de JavaScript traitent les chaînes de caractères commençant par 0 en octal (lorsqu'aucune base n'est spécifiée) et ni en 08 ni 09 sont des nombres octaux valides.

Depuis le site Mozilla la documentation :

Si radix est indéfini ou 0, JavaScript part du principe suivant :

  • Si la chaîne d'entrée commence par "0x" ou "0X", le radix est 16 (hexadécimal).
  • Si la chaîne d'entrée commence par " (octal). Cette fonctionnalité n'est pas standard, et certaines implémentations ne la supportent pas délibérément (elles utilisent plutôt le radix 10). Pour cette raison toujours spécifier un radix lors de l'utilisation de parseInt .
  • I commence par une autre valeur, le radix est 10 (décimal).

Si le premier caractère ne peut être converti en nombre, parseInt renvoie NaN.

Et à partir de la ECMAScript 3 standard :

Lorsque le radix est 0 ou indéfini et le numéro de la chaîne commence par un 0 non suivi d'un x o X , alors la mise en œuvre interpréter le nombre soit comme octal, soit comme décimal. décimal. Les implémentations sont encouragées à interpréter les nombres dans ce cas comme étant décimaux.

La dernière version de JavaScript ( ECMAScript 5 ) abandonne ce comportement mais vous devriez spécifier encore le radix pour satisfaire les navigateurs plus anciens.

15voto

John Hartsock Points 36565

Il existe un paramètre Radix

parseInt(value, base)

La base étant le radix.

Dans ce cas, vous évaluez des nombres en base 10 (décimaux), utilisez donc

parseInt(value, 10);

4voto

Maffelu Points 430

Cela ne semble pas être totalement valable dans les nouveaux navigateurs. Internet Explorer 9 et 10 renverront 8 si vous exécutez "parseInt("08")" alors qu'Internet Explorer 8 et les versions précédentes renverront 0 (IE10 en mode "quirks" renverra également 0).

La dernière version de Chrome renvoie également le chiffre 8, ce qui signifie que l'interprétation a dû être modifiée récemment.

0voto

Endless Points 1188

Conseil : Comme vous le savez maintenant, la valeur par défaut de l'octal a été supprimée. Voici comment résoudre ce problème dans les anciens navigateurs

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
    parseInt = (function (origParseInt) {
        var hexRegex = /^0[xX]/;
        return function parseIntES5(str, radix) {
            str = String(str).trim();
            if (!Number(radix)) {
                radix = hexRegex.test(str) ? 16 : 10;
            }
            return origParseInt(str, radix);
        };
    }(parseInt));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X