Как различить двоичные и шестнадцатеричные значения - PullRequest
0 голосов
/ 10 мая 2018

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

Я подумал, что выяснил это, проверив, содержит ли строка буквы или цифры выше 1, но как насчет в случае 101101 или другогоаналогичные шестнадцатеричные входы?Можно ли вообще узнать без какого-либо другого контекста?

Ради включения неудачных попыток я попробовал следующее, чтобы проверить, содержит ли строка буквы, шестнадцатеричные значения которых могут:

if (Number.isInteger(parseInt(input)))

, нокроме того, что это не решает вышеупомянутую проблему (так как шестнадцатеричные значения не всегда имеют буквы), он также завершается ошибкой, потому что он все еще возвращает true, когда буквы смешиваются во входных данных, поскольку он все равно анализирует целое число тем или иным способом.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Можно ли вообще узнать без какого-либо другого контекста?

Нет, это не так.Языки программирования часто допускают числовые литералы в различных системах счисления, но они должны быть помечены соответствующим образом.В JavaScript:

  • Без префикса: десятичный.Пример: 12345
  • 0b префикс: двоичный.Пример: 0b10101
  • 0o префикс: восьмеричное.Пример: 0o123
  • 0x префикс: шестнадцатеричный.Пример: 0x12345

Вам может потребоваться такая же запись для ввода, или вы предоставите другой элемент управления, который позволяет пользователю выбирать систему (вы все равно можете правильно ввести внутренний префикс ввода).


Для полноты, вот функция, которая преобразует любой из этих входных данных в числа:

const radixTable = {
  '0b': 2,
  '0o': 8,
  '0x': 16,
};

function convert(str) {
  let radix = 10;
  if (radixTable.hasOwnProperty(str.slice(0, 2))) {
      radix = radixTable[str.slice(0,2)];
      str = str.slice(2);
  }
  return parseInt(str, radix);
}

['12', '0b1100', '0o14', '0xC'].forEach(
  str => console.log(`${str}:`, convert(str))
);
0 голосов
/ 10 мая 2018

Мне не известно о том, что в JavaScript встроено множество расширенных математических возможностей. Если бы он был ориентирован на это, у него, вероятно, было бы больше числовых типов переменных, чтобы дать вам большие числа, например double или long. Возможно, вы захотите создать объект, который будет иметь свойство, чтобы установить, является ли число в объекте шестнадцатеричным или десятичным, а затем значение.

let numberObj = {
    numberSystem: 'decimal',
    value: '4505'
}
...