Javascript parseInt () с ведущими нулями

121

Функция parseInt в Javascript, похоже, не работает полностью.

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

Вы не можете этого объяснить. Попробуйте. (jsFiddle)

Изменить Поскольку этот вопрос был задан и дан ответ, "функция" по умолчанию для восьмеричного основания была устарела. [ 1 ] [ 2 ]

savinger
источник
30
ты, должно быть, шутишь
georg 06
6
You can't explain that. Да, вы можете => developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Rocket Hazmat 06
3
С возрастов любое число, начинающееся с 0, представляет Восьмеричное, а 0x - шестнадцатеричное. Я считаю, что это универсально для всех языков, но, опять же, могу ошибаться.
Selvakumar Arumugam
3
К вашему сведению: jsFiddle , онлайн-тестер JavaScript лучше, чем w3schools.com/jsref/tryit.asp .
Rocket Hazmat 06
2
@JohnHartsock Ага, это потому, что мы оба были в этом посте stackoverflow.com/questions/8761997/…
saveer 06

Ответы:

182

Это потому, что, если число начинается с «0», оно рассматривается как восьмеричное.

Вы можете форсировать базу, передав базу в качестве 2-го параметра.

parseInt("09", 10) // 9

Согласно документации , второй параметр является необязательным, но не всегда предполагается, что он равен 10, как вы можете видеть из своего примера.

Ракетный Хазмат
источник
1
да, но если предполагается восьмеричное, оно должно возвращать 11 вместо 09 вместо 0.
Peeyush Kushwaha
2
@PeeyushKushwaha: Другой способ. 11в базе 8 находится 9в базе 10. 09не является допустимым числом с основанием 8.
Rocket Hazmat
Но я хочу 09 после parseInt, есть ли способ
обойтись
39

При вызовах к parseIntвсегда следует указывать базу во втором аргументе:

parseInt("08", 10);

Более ранние версии JavaScript обрабатывают строки, начинающиеся с 0восьмеричной (если база не указана), и 08ни09 уважительных восьмеричные числа.

Из документации Mozilla :

Если основание системы счисления не определено или равно 0, JavaScript предполагает следующее:

  • Если входная строка начинается с «0x» или «0X», система счисления равна 16 (шестнадцатеричное).
  • Если входная строка начинается с «0», система счисления равна восьми (восьмеричная). Эта функция нестандартна, и некоторые реализации намеренно не поддерживают ее (вместо этого используется основание системы счисления 10). По этой причине при использовании parseInt всегда указывайте систему счисления. .
  • Если входная строка начинается с любого другого значения, система счисления равна 10 (десятичная).

Если первый символ не может быть преобразован в число, parseInt возвращает NaN.

И из стандарта ECMAScript 3 :

Когда основание системы счисления равно 0 или undefined, а номер строки начинается с цифры 0, за которой не следует x или X , то реализация может по своему усмотрению интерпретировать число либо как восьмеричное, либо как десятичное. Реализациям рекомендуется интерпретировать числа в этом случае как десятичные.

Последняя версия JavaScript ( ECMAScript 5 ) отказывается от этого поведения , но вы все равно должны указать основание системы счисления, чтобы удовлетворить запросы старых браузеров.

Wayne
источник
Поскольку это устарело, в будущем вам было бы хорошо использовать нули в начале, не так ли?
Pacerier
15

Есть параметр Radix

parseInt(value, base)

Где основание - это основание.

В этом случае вы оцениваете числа с основанием 10 (десятичные), поэтому используйте

parseInt(value, 10);
Джон Хартсок
источник
4

Похоже, это не совсем корректно в новых браузерах. Internet Explorer 9 и 10 вернет 8, если вы выполните 'parseInt ("08")', тогда как Internet Explorer 8 и предыдущие версии вернут 0 (IE10 в режиме совместимости также вернет 0).

Последняя версия Chrome также возвращает 8, поэтому они, должно быть, недавно изменили интерпретацию.

Maffelu
источник
Ага, поведение изменилось. Я обновлю свой ответ. developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Уэйн,
1
Да, у последней версии Firefox и Chrome сейчас нет проблем.
mythicalcoder
3

Эта проблема сейчас устарела. Но вы все равно можете использовать radix in parseIntдля преобразования числа других оснований в base-10. Например,

var baseTwoNumber = parseInt('0010001', 2);

возвращает 17(который равен основанию 10 0010001).

Мухаммад Имран
источник
0

Совет: Как вы теперь знаете, когда по умолчанию используется восьмеричное число, больше не рекомендуется. Вот как это исправить в устаревших браузерах

// 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));
}
Бесконечный
источник
PS: если вы используете только постоянное число с начальным нулем (вместо строки), оно по-прежнему рассматривается как базовое 8 во всех текущих браузерах.
Агамемнус 05
0

В большинстве браузеров проблема, похоже, изменилась.

Firefox 51.0.1 (64-разрядная версия)

parseInt("09")   // 9

Chrome 55.0.2883.95 (64-разрядная версия)

parseInt("09")   // 9

Safari 10.0 (12602.1.50.0.10)

parseInt("09")   // 9

=====

Рекомендуемая практика

Сказав это, чтобы быть в большей безопасности и избежать проблем, используйте параметр base / radix, как это предлагается в принятом ответе .

parseInt("09", 10)    // 9

Дополнительный тест

Я просто хотел проверить это, если аргумент не является строкой. Chrome и Safari дают точный результат. Firefox тоже возвращает правильный результат, но с предупреждением.

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)
mythicalcoder
источник
Если значение начинается с 0 и является числом, parseInt по-прежнему будет использовать базу 8. Попробуйте parseInt (020)
sirrocco
Да. Я даже указал на предложенный ответ. И я знаю лучшие практики и недостатки, которых следует избегать. Поэтому в своем ответе я также привел Рекомендуемые практики .
мифический