我如何解决JavaScript的parseInt八进制行为?

时间:2009-05-11 22:14:11

标签: javascript integer octal

尝试在JavaScript中执行以下操作:

parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!

我刚刚学会了JavaScript认为前导零表示octal integer的困难方式,并且由于base-8中没有"8""9",因此该函数返回零。不管喜欢与否,this is by design

有哪些解决方法?

注意:为了完整起见,我即将发布解决方案,但这是我讨厌的解决方案,所以请发布其他/更好的答案。


更新:

JavaScript标准的第5版(ECMA-262)引入了一个消除这种行为的重大变化。 Mozilla有一个很好的write-up

10 个答案:

答案 0 :(得分:321)

这是一个常见的Javascript问题,有一个简单的解决方案:

只需specify the base或'radix',就像这样:

parseInt('08',10); // 8

您也可以使用Number

Number('08'); // 8

答案 1 :(得分:42)

如果您知道,您的值将在有符号的32位整数范围内,那么~~x将在所有情况下执行正确的操作。

~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99)  === -1

如果查找二进制文件而不是~),则规范要求对参数执行“ToInt32”转换,该转换会明显转换为Int32,并指定将NaN值强制为零。

是的,这是令人难以置信的hackish但是非常方便......

答案 2 :(得分:24)

parseInt documentation,使用可选的radix参数指定base-10:

parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9

这让我觉得迂腐,混乱,冗长(真的,每一个parseInt中都有一个额外的论点?)所以我希望有一个更好的方法。

答案 3 :(得分:11)

function parseDecimal(s) { return parseInt(s, 10); }

编辑:制作自己的功能,做你真正想要的,如果你不喜欢一直在parseInt()调用中添加“,10”,这只是一个选项。它具有非标准功能的缺点:如果你经常使用它会更方便,但也许会让其他人感到困惑。

答案 4 :(得分:10)

指定基数:

var number = parseInt(s, 10);

答案 5 :(得分:7)

如果没有第二个参数,用一个假定为十进制的版本替换parseInt会不会很顽皮? (注意 - 未经测试)

parseIntImpl = parseInt
parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}

答案 6 :(得分:5)

对于十进制这个怎么样:

('09'-0) === 9  // true

('009'-0) === 9 // true

答案 7 :(得分:5)

  

您也可以使用一元运算符( + ),而不是使用parseFloat或parseInt。

+"01"
// => 1

+"02"
// => 2

+"03"
// => 3

+"04"
// => 4

+"05"
// => 5

+"06"
// => 6

+"07"
// => 7

+"08"
// => 8

+"09"
// => 9

并采取良好措施

+"09.09"
// => 9.09

MDN Link

  

一元加号运算符在其操作数之前,并计算其操作数,但尝试将其转换为数字(如果尚未)。虽然一元否定( - )也可以转换非数字,但一元加号是将某些内容转换为数字的最快和首选方式,因为它不会对数字执行任何其他操作。

答案 8 :(得分:4)

如果您已经使用parseInt完成了大量编码并且不想在所有内容中添加“,10”,则可以覆盖该函数以使基数10成为默认值:

window._oldParseInt = window.parseInt;
window.parseInt = function(str, rad) {
    if (! rad) {
        return _oldParseInt(str, 10);
    }
    return _oldParseInt(str, rad);
};

这可能会使后来的读者感到困惑,因此制作parseInt10()函数可能会更加不言自明。就个人而言,我更喜欢使用一个简单的功能而不是一直添加“,10” - 只是为错误创造了更多的机会。

答案 9 :(得分:0)

此问题无法在最新的Chrome或Firefox(2019)中复制。