Javascript parseInt给出了非常意外的结果

时间:2010-07-27 08:57:12

标签: javascript parseint

  

可能重复:
  Workarounds for JavaScript parseInt octal bug

我正在解析一个字符串以检查它是否是一个日期,我们现在发现我的方法不适用于八月或九月的日期。这就是我所做的(输入不是真的硬编码,显然,但为了简洁......):

var str = '2010-08-26 14:53';
var data = str.split(' ');  // ['2010-08-26', '14:53']
var date = data[0].split('-'); // ['2010', '08', '26]
var time = data[1].split(':'); // ['14', '53']

var yyyy = parseInt(date[0]); // 2010

// THIS IS WHERE STRANGE THINGS HAPPEN:
var MM = parseInt(date[1]); // 0 - not 08 or 8, as expected!
console.log(date[1]); // prints "08" (with quotes)
console.log(date[1].toString()); // prints 08 (no quotes)
console.log(parseInt(date[1].toString())); // prints 0 (!)

这个问题出现在8月和9月,以及每个月的第8和第9个 - 也就是说,当"08""09"被解析为整数时,会返回0 89。该代码适用于较低(例如"07")和较高(例如"10")整数(至少在预期日期范围内......)

我做错了什么?

4 个答案:

答案 0 :(得分:9)

使用

parseInt(date[1], 10)

确保字符串被解释为基数10(十进制)。

否则,如果它以"0"开头,则被解释为基数8(八进制),如果它以"0x"开头,则被解释为基数16(十六进制)。

实际上,你应该总是包含基本参数以避免这些类型的错误。

答案 1 :(得分:1)

这是因为以0开头的数字被视为八进制数,而“08”不是八进制数,因此返回0。

阅读本文:http://mir.aculo.us/2010/05/12/adventures-in-javascript-number-parsing/

答案 2 :(得分:1)

parseInt()函数具有第二个可选的radix参数。如果省略radix参数,则JavaScript假定以下内容:

  • 如果字符串以“0x”开头,则基数为16(十六进制)
  • 如果字符串以“0”开头,则基数为8(八进制)。不推荐使用此功能
  • 如果字符串以任何其他值开头,则基数为10(十进制)

所以在你的情况下,它假定八进制数。更改为var MM = parseInt(date[1], 10);,它将起作用

答案 3 :(得分:0)

听起来您的日期被解析为十六进制 - 前导零正在执行此操作。

因为0到7的十六进制和十进制表示相同,所以“工作”,但8和9的转换不正确。

使用

parseInt(date[1], 10)

明确指定基础。