Javascript 如何区分二进制和十六进制值

Javascript 如何区分二进制和十六进制值,javascript,binary,hex,Javascript,Binary,Hex,假设我需要用户输入一个二进制或十六进制的值,程序将从那里获取它。有没有办法区分他们输入的值是二进制还是十六进制 我想我已经通过检查字符串是否包含大于1的字母或数字找到了答案,但是对于101101或其他类似的十六进制输入又如何呢?在没有任何其他背景的情况下,是否有可能知道 为了包含失败的尝试,我尝试了以下方法来检查字符串是否包含十六进制值可能包含的字母: if (Number.isInteger(parseInt(input))) 但除了不能解决上述问题(因为十六进制值并不总是有字母)之外,它也

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

我想我已经通过检查字符串是否包含大于1的字母或数字找到了答案,但是对于101101或其他类似的十六进制输入又如何呢?在没有任何其他背景的情况下,是否有可能知道

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

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

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

我不知道JavaScript内置了很多高级数学功能。如果它是面向这一目的的,它可能会有更多的数值变量类型,给你更大的数字,比如double或long。您可能希望创建一个对象,该对象将具有一个属性来设置对象中的数字是十六进制还是十进制,然后设置值

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

我不知道JavaScript内置了很多高级数学功能。如果它是面向这一目的的,它可能会有更多的数值变量类型,给你更大的数字,比如double或long。您可能希望创建一个对象,该对象将具有一个属性来设置对象中的数字是十六进制还是十进制,然后设置值

let numberObj = {
    numberSystem: 'decimal',
    value: '4505'
}
在没有任何其他背景的情况下,是否有可能知道

不,不是。编程语言通常允许在各种数字系统中使用数字文字,但它们必须相应地进行标记。在JavaScript中:

  • 没有前缀:十进制。示例:
    12345
  • 0b
    前缀:二进制。示例:
    0b10101
  • 0o
    前缀:八进制。示例:
    0o123
  • 0x
    前缀:十六进制。示例:
    0x12345
您可能需要输入相同的符号,或者提供另一个允许用户选择系统的控件(您仍然可以正确地为输入添加内部前缀)


为了完整起见,这里有一个函数,可以将这些输入中的任何一个转换为数字:

const radixTable={
“0b”:2,
“0o”:8,
“0x”:16,
};
函数转换(str){
基数=10;
if(radixTable.hasOwnProperty(str.slice(0,2))){
基数=radixTable[str.slice(0,2)];
str=str.slice(2);
}
返回parseInt(str,基数);
}
['12','0b1100','0o14','0xC'](
str=>console.log(`${str}:`,convert(str))
);
在没有任何其他背景的情况下,是否有可能知道

不,不是。编程语言通常允许在各种数字系统中使用数字文字,但它们必须相应地进行标记。在JavaScript中:

  • 没有前缀:十进制。示例:
    12345
  • 0b
    前缀:二进制。示例:
    0b10101
  • 0o
    前缀:八进制。示例:
    0o123
  • 0x
    前缀:十六进制。示例:
    0x12345
您可能需要输入相同的符号,或者提供另一个允许用户选择系统的控件(您仍然可以正确地为输入添加内部前缀)


为了完整起见,这里有一个函数,可以将这些输入中的任何一个转换为数字:

const radixTable={
“0b”:2,
“0o”:8,
“0x”:16,
};
函数转换(str){
基数=10;
if(radixTable.hasOwnProperty(str.slice(0,2))){
基数=radixTable[str.slice(0,2)];
str=str.slice(2);
}
返回parseInt(str,基数);
}
['12','0b1100','0o14','0xC'](
str=>console.log(`${str}:`,convert(str))

);正如您所注意到的,当一些值可能是二进制或十六进制,而您仅仅通过查看字符串就不知道用户的意图时,这怎么可能呢?@stephen.vakil要添加到这一点上,相同的数字可以是十进制或oct,并且仍然有效。如果有人未经询问就在纸上写下了IRL,你就无法判断它,所以我真的看不出你是如何通过编程实现它的。我认为读心术模块还没有准备好进行beta测试。@stephen.vakil我知道这个问题的答案,但我想征求更有经验的开发人员的意见,因为我在谷歌搜索转换器或Regexp测试时找不到其他的东西,而这些测试在我上面提供的值上失败了。这怎么可能呢正如您所注意到的,当一些值可以是二进制或十六进制,并且您仅仅通过查看字符串?@stephen.vakil来添加就不知道用户的意图时,相同的数字可以是十进制或oct,并且仍然有效。如果有人未经询问就在纸上写下了IRL,你就无法判断它,所以我真的看不出你是如何通过编程实现它的。我认为读心术模块还没有准备好进行beta测试。@stephen.vakil我知道这个问题的答案,但我想征求更有经验的开发人员的意见,因为我无法通过谷歌搜索找到更多其他方法,只搜索转换器或Regexp测试,这些测试在我上面提供的值上失败。如果是正常人输入它时,有一个文本输入和一个单选按钮或下拉菜单来选择值的类型可能更方便用户。不过,这并不能改变这样一个事实,即你需要用户明确他们的意图。这是我的想法,但我想与更有经验的开发人员确认一下。我想让它对用户来说尽可能简单,让他们输入最少的信息量(仅仅是字符串),但它看起来需要更多的信息。谢谢您提供的信息性答案。@Mr.Smithyyy:如果目标受众知道什么是二进制、八进制和十六进制数字,那么