Javascript parseInt() 带前导零

问题描述 投票:0回答:7

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

你无法解释这一点。 尝试一下。 (jsFiddle)

编辑自从提出并回答这个问题以来,默认为八进制基数的“功能”已被弃用。 [1] [2]

javascript
7个回答
192
投票

这是因为如果数字以“0”开头,则会被视为以 8 为基数(八进制)。

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

parseInt("09", 10) // 9

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


45
投票

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

parseInt("08", 10);

早期版本的 JavaScript 将以

0
开头的字符串视为八进制(未指定基数时),并且
08
09
都不是有效的八进制数。

来自 Mozilla 文档

如果基数未定义或为 0,JavaScript 会进行以下假设:

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

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

来自 ECMAScript 3 标准:

当基数为 0 或 undefined 并且字符串的数字以 0 开头时 数字后面没有 xX,那么实现可以在其 自行决定,将数字解释为八进制或 十进制。鼓励实现者解释此中的数字 大小写为十进制。

最新版本的 JavaScript (ECMAScript 5) 放弃了这种行为,但您应该仍然指定基数以满足旧版浏览器的要求。


16
投票

有一个Radix参数

parseInt(value, base)

其中base是基数。

在本例中,您正在评估以 10 为基数的(十进制)数字, 因此使用

parseInt(value, 10);

4
投票

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

最新版本的 Chrome 也返回了 8,所以他们最近一定改变了解释。


3
投票

此问题现已弃用。但您仍然可以使用

parseInt
中的基数将其他基数转换为基数 10。例如,

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

返回

17
(以 10 为基数
0010001
)。


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));
}

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

=====

推荐做法

话虽如此,为了更安全并避免出现问题,请按照接受的答案中的建议使用基数/基数参数。

parseInt("09", 10)    // 9

额外测试

如果参数不是字符串,我也想测试一下。 Chrome 和 Safari 给出了准确的结果。 Firefox 也返回正确的结果,但带有警告。

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)
© www.soinside.com 2019 - 2024. All rights reserved.