假设我需要用户输入一个二进制或十六进制值,程序将从那里获取它。有没有办法区分输入的值是二进制还是十六进制?

我以为可以通过检查字符串是否包含大于1的字母或数字来弄清楚,但是对于101101或其他类似的十六进制输入该怎么办?在没有其他任何上下文的情况下甚至有可能知道吗?

为了包括失败的尝试,我尝试了以下方法来检查字符串是否包含可以十六进制值的字母:

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


但是除了不能解决上述问题(因为十六进制值并不总是有字母)外,它也失败了,因为当字母混入输入中时它仍然返回true,因为它仍然以一种或另一种方式解析整数。

最佳答案

在没有其他任何上下文的情况下甚至有可能知道吗?


不,这不对。编程语言通常允许在各种数字系统中使用数字文字,但是必须对其进行相应的标记。在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))
);

09-25 18:31