它适用于很多数字类型,但不适用于十六进制或二进制的负数。
但是,Number(octal)
没有解析八进制数。
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()
请不要帮助我,因为我需要检查每种可能性(例如,以0x
开头我使用16
。
编辑B
如果我在Chrome控制台0777
上写字,它会转到511
,也会允许负值。即使我直接写入javascript代码也能正常工作。所以我希望基本上是一个像javascript解析器一样工作的解析器。但我认为,例如,负十六进制在解析器中确实是0 - Number(hex)
,而不是Number(-hex)
。但八进制值没有意义。
答案 0 :(得分:4)
试试这个:
parseInt(string,base):
parseInt("-0777", 8)
parseInt("-0x10", 16)
答案 1 :(得分:2)
您可以编写一个函数来处理负值。
function parseNumber (num) {
var neg = num.search('-') > -1;
var num = Number(num.replace('-', ''));
return num * (neg ? -1 : 1);
}
答案 2 :(得分:0)
它不解析八进制和其他示例,因为它们不是有效的Javascript数,至少在Number
的约束内。所以技术上正确的答案是:使用Number
!
如果你想解析其他格式,那么你可以使用parseInt
,但你必须提供基础。
答案 3 :(得分:0)
这有点难看,但您可以检查值以确定parseInt
的正确基数。特别是,二进制文件b
似乎根本不支持我的浏览器(Chrome),因此与OP不同,Number("0b10")
会给我NaN
。因此,您需要删除b
才能使其正常工作。
var numbers = [
"15", "-15", "0x10", "0b10", "-0x10", "-0b10", "0777", "-0777"
];
function parser(val) {
if (val.indexOf("x") > 0) {
// if we see an x we assume it's hex
return parseInt(val, 16);
} else if (val.indexOf("b") > 0) {
// if we see a b we assume it's binary
return parseInt(val.replace("b",""),2);
} else if (val[0] === "0") {
// if it has a leading 0, assume it's octal
return parseInt(val, 8);
}
// anything else, we assume is decimal
return parseInt(val, 10);
}
for (var i = 0; i < numbers.length; i++) {
console.log(parser(numbers[i]));
}
&#13;
请注意,这显然不是万无一失(例如,我正在检查x
而不是X
),但如果需要,可以使其更加强大。< / p>