JavaScript — предотвращение восьмеричного преобразования

Я принимаю числовой ввод в качестве аргумента и просто пытаюсь учесть начальные нули. Но кажется, что javascript преобразует число в восьмеричное, прежде чем я смогу что-либо сделать с числом. Единственный способ обойти это до сих пор - это если я сначала передам число как строку, но я надеялся, что будет другой способ преобразовать его после его передачи? До сих пор пытался (используя 017, который предупредил меня о восьмеричном поведении):

017.toString(10) // 15
parseInt(017,10) // 15
017 + "" //15
new Number(017) //15

new Number('017') //17
parseInt('017', 10) // 17

Так дано

function(numb) {

if (typeof numb === number) {
// remove leading zeroes and convert to decimal
}
else {
 // use parseInt
}

}

'use strict' также, похоже, не решает эту проблему, как предлагалось в некоторых старых сообщениях. Любые идеи?


person CarlH    schedule 21.12.2015    source источник
comment
Как вы принимаете числовой ввод, и он не выходит в виде строки...?! Number не может иметь ведущих нулей.   -  person deceze♦    schedule 21.12.2015


Ответы (3)


  1. Если вы принимаете «числовой ввод», вы всегда должны обязательно иметь строку. В этом контексте нет известного мне метода ввода, который бы возвращал Number. Поскольку вы получаете строку, parseInt(.., 10) всегда будет достаточно. 017 интерпретируется как восьмеричное только в том случае, если оно написано буквально как таковое в исходном коде (или при отсутствии параметра системы счисления для parseInt).
  2. Если по какой-то странной причине вы в конечном итоге получите десятичное число, интерпретируемое как восьмеричное, и вы хотите обратно преобразовать значение обратно в десятичное, это довольно просто: выразить значение в восьмеричном и переинтерпретировать его как десятичное:

    var oct = 017; // 15
    parseInt(oct.toString(8), 10) // 17
    

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

person deceze♦    schedule 21.12.2015
comment
Извините, под числовым вводом я просто имел в виду, что передал функции число вроде 017, а не «017». Это просто из интереса, а не требование, поскольку я думал об учете отправки чисел, которые (возможно, случайно) имеют несколько ведущих нулей. Ваш второй ответ тоже очень помогает, я не думал об этом. Спасибо за Ваш ответ! - person CarlH; 21.12.2015
comment
Если вы пишете 017 в своем исходном коде в качестве аргумента функции, вы пишете 15. Просто в другом обозначении. Числа не имеют лидирующих нулей. Пишите то, что имеете в виду, не заставляйте свой код адаптироваться к тому, чего вы на самом деле не имели в виду. - person deceze♦; 21.12.2015

JavaScript интерпретирует все числа, начинающиеся с 0 и содержащие все восьмеричные числа, как восьмеричные — например, 017 будет восьмеричным, а 019 — нет. Если вы хотите, чтобы ваше число было десятичным, то либо
1. Опустите начальный 0.
2. Продолжайте использовать parseInt().

Причина в том, что JavaScript использует несколько неявных преобразований и выбирает наиболее вероятный случай на основе числа. В JavaScript было решено, что начальный 0 является сигналом того, что число является восьмеричным. Если вам нужен этот начальный 0, вы должны принять это правило и использовать parseInt().

Источник

person Flash_Steel    schedule 21.12.2015

Если вы вводите числа вручную в сценарий, то не используйте начальные нули (которые неявно обрабатывают число как восьмеричное, если оно действительно восьмеричное, а если нет, то обрабатывайте его как десятичное). Если у вас есть число в виде строки, просто используйте оператор + для приведения к (десятичному) числу.

console.log(+"017")

if (021 < 019) console.log('Paradox');

Строгий режим не позволит использовать нулевой префикс

'use strict'

if (021 < 019) console.log('Paradox');

person Kamil Kiełczewski    schedule 02.05.2019