代码之家  ›  专栏  ›  技术社区  ›  Portman

我如何处理javascript的parsing八进制行为?

  •  271
  • Portman  · 技术社区  · 15 年前

    尝试在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 因为没有 "8" "9" 在Base-8中,函数返回零。不管你喜不喜欢, this is by design .

    解决方法是什么?

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


    更新:

    javascript标准的第5版( ECMA-262 )引入一个中断更改,以消除此行为。Mozilla有一个很好的 write-up .

    9 回复  |  直到 6 年前
        1
  •  318
  •   groovecoder mkluwe    10 年前

    这是一个常见的javascript gotcha,有一个简单的解决方案:

    只是 specify the base 或“基数”,如:

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

    你也可以用 Number :

    Number('08'); // 8
    
        2
  •  42
  •   Karl Guertin    15 年前

    如果你 知道 您的值将在有符号的32位整数范围内,然后 ~~x 在所有情况下都会做正确的事情。

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

    如果你查二进制的话( ~ )规范要求对参数进行“to int32”转换,该参数执行到int32的明显转换,并指定为强制 NaN 值为零。

    是的,这是令人难以置信的黑客,但很方便…

        3
  •  24
  •   Portman    15 年前

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

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

    这让我觉得很迂腐、困惑和冗长(真的,每一个parseint中都有一个额外的参数?)所以我希望有更好的方法。

        4
  •  11
  •   Jason S    15 年前
    function parseDecimal(s) { return parseInt(s, 10); }
    

    编辑:如果您不喜欢在parseInt()调用中一直添加“、10”,那么让您自己的函数执行您真正想要的操作只是一个选项。它的缺点是它是一个非标准的函数:如果您经常使用它,它会更方便,但对于其他人来说可能会更混乱。

        5
  •  10
  •   RichieHindle    15 年前

    指定基础:

    var number = parseInt(s, 10);
    
        6
  •  7
  •   Andrew Duffy    15 年前

    如果ParseInt没有第二个参数,用一个假定为十进制的版本替换它会很淘气吗?(注-未测试)

    parseIntImpl = parseInt
    parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}
    
        7
  •  5
  •   Mark Hall    13 年前

    这个小数点怎么样:

    ('09'-0) === 9  // true
    
    ('009'-0) === 9 // true
    
        8
  •  4
  •   ingredient_15939    13 年前

    如果您已经使用parseint进行了大量的编码,并且不想在所有内容中添加“10”,那么您可以重写函数,使base 10成为默认值:

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

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

        9
  •  4
  •   SoEzPz    6 年前

    您也可以使用一元运算符,而不是使用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

    一元加号运算符位于其操作数之前,计算结果为其操作数,但如果尚未转换为数字,则尝试将其转换为数字。虽然一元负(-)也可以转换非数字, 一元加号是将某物转换为数字的最快和首选方法。 ,因为它不对数字执行任何其他操作。