带有前导零的Javascript parseInt()

时间:2012-01-06 19:32:51

标签: javascript

Javascript的parseInt函数似乎没有完全奏效。

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0

你无法解释。 Give it a try. (jsFiddle)

编辑由于此问题已被询问和回答,因此不推荐使用默认为八进制基数的“功能”。 [1] [2]

7 个答案:

答案 0 :(得分:170)

这是因为如果数字以'0'开头,则将其视为基数8(八进制)。

您可以通过将基数作为第二个参数传递来强制基础。

parseInt("09", 10) // 9

根据the docs,第二个参数是可选的,但并不总是假设为10,正如您从示例中看到的那样。

答案 1 :(得分:38)

parseInt的调用应始终在第二个参数中指定基数:

parseInt("08", 10);

早期版本的JavaScript将以0开头的字符串视为八进制(未指定基数时),0809都不是有效的八进制数。

来自Mozilla documentation

  

如果radix未定义或为0,则JavaScript假定以下内容:

     
      
  • 如果输入字符串以“0x”或“0X”开头,则基数为16   (十六进制)。
  •   
  • 如果输入字符串以“0”开头,则基数为8   (八进制)。此功能是非标准的,有些实现   故意不支持它(而是使用基数10)。为了这   原因在使用parseInt 时始终指定基数。
  •   
  • 如果是输入字符串   从任何其他值开始,基数为10(十进制)。
  •   
     

如果第一个字符无法转换为数字,则parseInt返回NaN。

来自ECMAScript 3标准:

  

当基数为0或未定义时,字符串的数字以 0 开头   数字后面没有 x X ,然后执行可能会   自由裁量权,将数字解释为八进制或为八进制   小数。鼓励实现解释数字   案例为十进制。

最新版本的JavaScript(ECMAScript 5abandons this behavior,但仍应指定基数以满足旧版浏览器的需要。

答案 2 :(得分:15)

有一个Radix参数

parseInt(value, base)

其中base是基数。

在这种情况下,您正在评估base10(十进制)数字, 因此使用

parseInt(value, 10);

答案 3 :(得分:4)

这在新浏览器中似乎并不完全有效。如果执行'parseInt(“08”)',Internet Explorer 9和10将返回8,而Internet Explorer 8和以前的版本将返回0(怪异模式下的IE10也将返回0)。

Chrome的最新版本也会返回8,因此他们最近必须更改解释。

答案 4 :(得分:2)

此问题现已弃用。但你仍然可以在parseInt中使用基数将其他基数转换为基数10。如,

var baseTwoNumber = parseInt('0010001', 2);

返回170010001的基数为10)。

答案 5 :(得分:0)

提示:正如您现在所知,默认为八进制已被弃用。以下是在旧版浏览器中修复它的方法

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
    parseInt = (function (origParseInt) {
        var hexRegex = /^0[xX]/;
        return function parseIntES5(str, radix) {
            str = String(str).trim();
            if (!Number(radix)) {
                radix = hexRegex.test(str) ? 16 : 10;
            }
            return origParseInt(str, radix);
        };
    }(parseInt));
}

答案 6 :(得分:0)

现在大多数浏览器的问题似乎已经改变了。

Firefox 51.0.1(64位)

parseInt("09")   // 9

Chrome 55.0.2883.95(64位)

parseInt("09")   // 9

Safari 10.0(12602.1.50.0.10)

parseInt("09")   // 9

=====

推荐做法

话虽如此,为了避免出现更安全的问题,请使用accepted answer中建议的base / radix参数。

parseInt("09", 10)    // 9

额外测试

如果参数不是字符串,我只想测试它。 Chrome& Safari提供准确的结果。 Firefox也会返回正确的结果,但会发出警告。

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)