2

可能重复:
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"or"09"被解析为整数时,0返回而不是8or 9。该代码适用于较低(例如"07")和较高(例如"10")整数(至少在预期日期范围内......)

我究竟做错了什么?

4

4 回答 4

9

采用

parseInt(date[1], 10)

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

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

实际上,您应该始终包含 base 参数以避免这些类型的错误。

于 2010-07-27T09:00:36.520 回答
1

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

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

于 2010-07-27T09:02:18.707 回答
1

parseInt() 函数有第二个可选的 radix 参数。如果 radix 参数被省略,JavaScript 假设如下:

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

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

于 2010-07-27T09:06:51.867 回答
0

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

因为 0-7 的十六进制和十进制表示相同,所以它“有效”,但 8 和 9 被错误地转换。

采用

parseInt(date[1], 10)

明确指定基数。

于 2010-07-27T09:05:00.560 回答