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

时间:2015-03-06 20:40:34

标签: javascript numbers

它适用于很多数字类型,但不适用于十六进制或二进制的负数。 但是,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)。但八进制值没有意义。

4 个答案:

答案 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;
&#13;
&#13;

请注意,这显然不是万无一失(例如,我正在检查x而不是X),但如果需要,可以使其更加强大。< / p>