Как удалить ведущие нули из числа в параметре функции

У меня есть функция, которая принимает число/целое число в качестве параметра, и я пытаюсь удалить все возможные ведущие нули из этого числа, прежде чем делать что-либо еще в функции. Однако числа с ведущими нулями, похоже, уже каким-то образом проанализированы, прежде чем я смогу что-то сделать с параметром функции.

До сих пор я пробовал это:

function numToString(num){
    var string = num.toString();
    console.log(string);
};

numToString(0011); // output is "9"
numToString(1111); // output is "1111"

Я также пробовал это:

function numToString(num, base){
    var string = num.toString();
    var parse = parseInt(string, base);
    console.log(parse);
};

numToString(0011, 10); // output is "9"
numToString(1111, 10); // output is "1111"

Конечно, второй пример не работает, так как num.toString() изначально не дал ожидаемого результата. Я не хочу заменять параметр функции "num" строкой, но оставлю его как число.

Может быть, есть что-то очевидное, что я упускаю, но я не могу понять, что именно. Я знаю, что число с начальными нулями рассматривается как восьмеричное число, но я хотел бы знать, могу ли я работать с числом, введенным в качестве параметра, когда оно имеет начальные нули (т. е. не исходит из переменной, а буквально вводится как параметр функции).


person McVenco    schedule 30.11.2018    source источник
comment
Если num является числом, то оно никогда не может иметь ведущих нулей.   -  person CertainPerformance    schedule 30.11.2018
comment
Это пришло мне в голову, но как мне тогда поймать данный пример numToString(0011)? Даже если он напрямую передается в функцию где-то в коде?   -  person McVenco    schedule 30.11.2018
comment
восьмеричные числа...   -  person epascarello    schedule 30.11.2018
comment
Возможный дубликат javascript возвращает 9 для 0011   -  person George    schedule 30.11.2018
comment
Возможный дубликат Почему JavaScript обрабатывает число как восьмеричное, если оно имеет начальный ноль   -  person Reinstate Monica Cellio    schedule 30.11.2018
comment
Я знаю, что число рассматривается как восьмеричное, но я искал способ работать с фактическим вводом, прежде чем он даже будет распознан как восьмеричное число. Скажем, я хочу иметь это как пакет npm (чистый гипотетически), кто-то другой устанавливает его и вводит numToString(0011) - есть ли способ поймать это или вернуть ошибку, когда это произойдет?   -  person McVenco    schedule 30.11.2018
comment
Нет - это невозможно поймать, поскольку это уже произошло до того, как ваш код увидит значение. Единственный способ справиться с этим — сделать его строкой. Если вы поставите перед числом любое количество нулей (и оно действительно восьмеричное), оно будет преобразовано, как если бы оно было восьмеричным. Когда вы вводите numToString(0011), интерпретатор Javascript сразу же видит numToString(9). Это никогда не 0011.   -  person Reinstate Monica Cellio    schedule 30.11.2018
comment
@Archer - это уже произошло до того, как ваш код увидит значение, я думаю, это в значительной степени то объяснение, которое я искал. Я думаю, что либо буду использовать строку, либо просто задокументирую функцию, поскольку НЕ используйте начальные нули :). Спасибо!   -  person McVenco    schedule 30.11.2018
comment
"Я знаю, что число рассматривается как восьмеричное, но я искал способ работать с фактическим вводом еще до того, как он будет распознан как восьмеричное число". - тогда вы бы самостоятельно разобрать исходный код JavaScript… иначе это невозможно. Это не данные, это код (который затем становится данными, но только позже) - то, что здесь происходит, происходит в парсере уровень.   -  person misorude    schedule 30.11.2018


Ответы (1)


Причина, по которой это происходит, заключается в том, что начальное число с нулем заставляет javascript интерпретировать число в восьмеричном формате. Вы никак не можете изменить эту интерпретацию, но если вы получаете значение откуда-то в виде строки, вы можете использовать parseInt(string, 10)

Мы можем сделать это преобразование строки самостоятельно, а затем проанализировать его в базе 10 следующим образом:

let number = 0011
console.log(parseInt(number.toString(8),10))

Другая часть вашего вопроса спрашивает, можете ли вы бросить при вводе восьмеричного числа.

'use strict' делает именно это:

В-шестых, строгий режим в ECMAScript 5 запрещает восьмеричный синтаксис. Восьмеричный синтаксис не является частью ECMAScript 5, но поддерживается во всех браузерах за счет префикса восьмеричного числа с нулем: 0644 === 420 и "\045" === "%". В ECMAScript 2015 восьмеричное число поддерживается путем добавления к числу префикса "0o". то есть var a = 0o10; // ES2015: Octal

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

person giraffesyo    schedule 30.11.2018
comment
Проблема, похоже, в том, что параметр num уже рассматривается как восьмеричное число, прежде чем я смогу что-то с ним сделать. Я искал способ обойти это и взять буквально введенный ввод и работать с ним. - person McVenco; 30.11.2018
comment
@McVenco Откуда вы это передаете? Это должно было быть где-то пронумеровано. - person giraffesyo; 30.11.2018
comment
См. также мой комментарий к вопросу: скажем, я хочу иметь это как пакет npm (чистый гипотетически), кто-то другой устанавливает его и вводит numToString(0011) - есть ли способ это поймать или вернуть ошибку, когда это произойдет? - person McVenco; 30.11.2018
comment
@McVenco Хорошо, посмотри мои правки. Я думаю, что лучше изменить его там, где он сохраняется, потому что этот способ требует, чтобы вы думали о типе числа в прерывистых состояниях, но это послужит вашим целям. - person giraffesyo; 30.11.2018
comment
Это помогает, но он по-прежнему будет преобразовывать любое введенное число с ведущими нулями или без них. Возможно, мне было бы лучше использовать строку или просто задокументировать функцию, поскольку НЕ используйте начальные нули :) - person McVenco; 30.11.2018
comment
Поскольку числа хранятся в двоичном формате, нет способа обнаружить, было ли число введено в восьмеричном формате или нет, оно сохраняется точно так же, это все еще просто число. Программист действительно должен использовать его правильно. Если бы вы могли получить его в виде строки, вы могли бы написать эту логику обнаружения самостоятельно. - person giraffesyo; 30.11.2018
comment
@McVenco снова обновил мой ответ, на самом деле есть способ выдать ошибку. - person giraffesyo; 30.11.2018
comment
О, круто, это действительно может решить мою проблему! Я не слишком знаком со строгим режимом, поэтому я этого не знал. Я приму ваш ответ за это. - person McVenco; 30.11.2018