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);
}