2010-07-27 71 views
2

可能重复:
Workarounds for JavaScript parseInt octal bug的JavaScript parseInt函数给出了非常意外的结果

我解析字符串,检查它是否是一个日期,一个偶然的机会,我们现在发现,我的方法没有按8月份或9月份不适合日期。这是我做什么(输入是不是真的硬编码,很明显,但为了简洁...):

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")整数(至少预期日期范围内...)

我在做什么错?

回答

9

使用

parseInt(date[1], 10) 

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

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

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

+0

有趣的事实:第二个参数(“基数”)可以是从2到36的任何整数,允许使用ASCII字母和数字表示的许多神秘数字系统。 – Tomalak 2010-07-27 09:07:37

+2

最后一句话+1。我通常懒得做的一步> _ <...它会让你免于如此多的头痛 – Warty 2010-07-27 09:36:54

0

这听起来像你的日期被解析为十六进制 - 前导零是这样做的。

由于十六进制和十进制表示法对于0-7是相同的,所以'有效',但是8和9得到不正确的转换。

使用

parseInt(date[1], 10) 

要明确指定的基础。

1

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

  • 如果字符串以“0x”开始,基数是16(十六进制)
  • 如果字符串开头的“0”,基数为8 (八进制)。此功能已被弃用
  • 如果字符串以其他任何值开头,基数是10(十进制)

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

相关问题