Javascript:解析负数(十六进制|二进制)

Javascript:解析负数(十六进制|二进制),javascript,numbers,Javascript,Numbers,它适用于许多批号类型,但不适用于负数十六进制或二进制。 同样,Number(八进制)也不会解析八进制数 Number("15") === 15; // OK Number("-15") === -15; // OK Number("0x10") === 16; // OK Number("0b10") === 2; // OK Number("-0x10") === NaN; // FAIL (expect -16) Number("-0b10") =

它适用于许多批号类型,但不适用于负数十六进制或二进制。 同样,
Number(八进制)
也不会解析八进制数

Number("15")    ===   15;  // OK
Number("-15")   ===  -15;  // OK
Number("0x10")  ===   16;  // OK
Number("0b10")  ===    2;  // OK
Number("-0x10") ===  NaN;  // FAIL (expect  -16)
Number("-0b10") ===  NaN;  // FAIL (expect   -2)
Number("0777")  ===  777;  // FAIL (expect  511)
Number("-0777") === -777;  // FAIL (expect -511)
问题:如何正确解析所有有效的Javascript数字

编辑一份

parseInt()

编辑B


如果我在Chrome控制台上写入
0777
,它会变成
511
,并且也允许负值。即使我直接写进javascript代码也可以工作。所以我希望基本上有一个类似javascript解析器的解析器。但是我认为负十六进制,例如,在解析器中实际上是
0-Number(hex)
,而不是字面上的
Number(-hex)
。但是八进制值没有意义。

它没有解析八进制和其他示例,因为它们不是有效的Javascript数字,至少在
Number
的限制范围内。因此,技术上正确的答案是:使用
数字

如果要解析其他格式,则可以使用
parseInt
,但必须提供基本格式。

尝试以下方法:

parseInt(字符串,基):


您可以编写一个函数来处理负值

function parseNumber (num) {
   var neg = num.search('-') > -1;
   var num = Number(num.replace('-', ''));
   return num * (neg ? -1 : 1);
}

这有点难看,但您可以检查这些值以确定
parseInt
的正确基数。特别是,我的浏览器(Chrome)似乎根本不支持二进制的
b
,因此与OP不同,
Number(“0b10”)
给了我
NaN
。因此,您需要删除
b
,它才能正常工作

var编号=[
“15”、“-15”、“0x10”、“0b10”、“-0x10”、“-0b10”、“0777”、“-0777”
];
函数分析器(val){
如果(val.indexOf(“x”)>0){
//如果我们看到一个x,我们假设它是十六进制
返回parseInt(val,16);
}否则如果(val.indexOf(“b”)>0){
//如果我们看到一个b,我们假设它是二进制的
返回parseInt(val.replace(“b”),2);
}否则如果(val[0]=“0”){
//如果它有一个前导0,假设它是八进制
返回parseInt(val,8);
}
//我们假设其他任何东西都是十进制的
返回parseInt(val,10);
}
对于(变量i=0;i}
您可以轻松创建自己的函数,该函数检查字符串的前三个字符并进行相应处理。
parseInt()
与匹配的基数似乎可以工作。
parseInt(“-0x10”,16)
为您提供
-16
,以及
parseInt(-0777,8)
为您提供了
-511
尚未定义为支持符号。只有小数位数包含SignedInteger的语法。关于“编辑B:”ES6中的八进制文字已更改为
0o[0-7]+
。现在的
0[0-7]+
的“传统”语法只有在不使用严格模式时才继续可用。“因为它们不是有效的Javascript数字”:为什么
-0x10
不是有效数字?在
数字
的约束范围内它无效。例如,π²是一个有效的数字,但不在
number
中,也不在Javascript中!如果您提到将字符串转换为数字的算法(这与
Number
函数!)()不同),那么我同意。当我说“有效数字”时,我的意思是在JavaScript中。所以是的,
π²
不是一个有效的数字,但是
-0x10
是:
console.log(-0x10)
(虽然从技术上讲,
0x10
是数字
-
是一元减号运算符)。关键是这个字符序列在JS源代码中是有效的。我想问题在于,基数事先是未知的。
function parseNumber (num) {
   var neg = num.search('-') > -1;
   var num = Number(num.replace('-', ''));
   return num * (neg ? -1 : 1);
}