【问题标题】:Javascript parseInt gives very unexpected results [duplicate]Javascript parseInt 给出了非常意想不到的结果[重复]
【发布时间】:2011-03-21 12:01:18
【问题描述】:

可能重复:
Workarounds for JavaScript parseInt octal bug

我正在解析一个字符串以检查它是否是一个日期,偶然发现我的方法不适用于 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 而不是 8 或 @ 987654327@。该代码适用于较低(例如"07")和较高(例如"10")整数(至少在预期的日期范围内......)

我做错了什么?

【问题讨论】:

    标签: javascript parseint


    【解决方案1】:

    使用

    parseInt(date[1], 10)
    

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

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

    事实上,您应该始终包含基本参数以避免此类错误。

    【讨论】:

    • 有趣的事实:第二个参数(“基数”)可以是 2 到 36 之间的任何整数,允许许多使用 ASCII 字母和数字表示的深奥数字系统。
    • +1 表示最后一句话。我通常懒得做的一步>_<...>
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      因此,在您的情况下,它假定为八进制数。改成var MM = parseInt(date[1], 10);就可以了

      【讨论】:

        【解决方案4】:

        听起来您的日期被解析为十六进制 - 前导零正在这样做。

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

        使用

        parseInt(date[1], 10)
        

        明确指定基数。

        【讨论】:

          猜你喜欢
          • 2013-07-19
          • 1970-01-01
          • 2017-11-30
          • 2017-10-26
          • 2019-05-19
          • 2017-01-05
          • 2021-10-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多