先頭がゼロのJavascript parseInt()


119

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)

編集この質問に対する回答があったため、デフォルトで8進基数に設定する「機能」は廃止されました。[ 1 ] [ 2 ]


28
あなたはからかっている必要があります
georg

6
You can't explain that. はいすることができます=> developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
ロケット危険物

3
古くなってから、0で始まる数値はOCTALを表し、0xは16進数を表します。これはすべての言語で共通であると思いますが、ここでも間違っている可能性があります。
Selvakumar Arumugam 2012年

3
参考jsFiddleはw3schools.com / jsref / tryit.aspよりも優れたオンラインJavaScriptテスターです
ロケットハズマット2012年

2
私たちはこの記事に両方だったので、それはだ@JohnHartsock葉、stackoverflow.com/questions/8761997/...
savinger

回答:


180

これは、数値が「0」で始まる場合、8進数(8進数)として扱われるためです。

2番目のパラメーターとしてベースを渡すことにより、ベースを強制できます。

parseInt("09", 10) // 9

docsによると 2番目のパラメーターはオプションですが、例からわかるように、必ずしも 10であるとは限りません。


1
それは進仮定だ場合ええ、しかし、それは09の代わりに0のために11を返すべきである
Peeyush Kushwaha

2
@PeeyushKushwaha:他の方法です。 11ベース8は9ベース10に09あります。 は有効なベース8番号ではありません。
ロケットHazmat 2013年

しかし、parseIntの後に09が欲しいのですが、方法はありますか
Pardeep Jain

39

の呼び出しでparseIntは、常に2番目の引数でベースを指定する必要があります。

parseInt("08", 10);

以前のバージョンのJavaScriptは0、8進数(ベースが指定されていない場合)で始まる文字列を扱い、有効な8進数で08もありません09

Mozillaのドキュメントから:

基数が未定義または0の場合、JavaScriptは以下を想定します。

  • 入力文字列が「0x」または「0X」で始まる場合、基数は16(16進数)です。
  • 入力文字列が「0」で始まる場合、基数は8(8進数)です。この機能は非標準であり、実装によっては意図的にサポートされていません(基数10を使用しています)。このため、parseIntを使用するときは常に基数を指定してください
  • 入力文字列が他の値で始まる場合、基数は10(10進数)です。

最初の文字を数値に変換できない場合、parseIntはNaNを返します。

そしてECMAScript 3標準から:

基数が0または未定義であり、文字列の番号が0の 数字で始まり、その後にxまたはXが続いていない場合、実装は独自の裁量で、数値を8進数または10進数として解釈します。この場合、実装では数値を10進数として解釈することをお勧めします。

JavaScriptの最新バージョン(ECMAScript 5はこの動作を放棄しますが、古いブラウザーを満たすために基数指定する必要があります。


これは非推奨であるため、将来的には先行ゼロを使用しても問題ないでしょうか?
Pacerier、2015年

15

基数パラメータがあります

parseInt(value, base)

基数は基数です。

この場合、base10(10進数)の数値を評価しているので、

parseInt(value, 10);

4

これは新しいブラウザでは完全に有効ではないようです。Internet Explorer 9および10は、「parseInt( "08")」を実行すると8を返しますが、Internet Explorer 8以前のバージョンは0を返します(互換モードのIE10も0を返します)。

Chromeの最新バージョンも8を返すので、最近の解釈が変わっているはずです。


はい、動作が変更されました。回答を更新します。developer.mozilla.org/en-US/docs/JavaScript/Reference/...
ウェイン・

1
はい、FirefoxとChromeの最新バージョンに問題はありません。
mythicalcoder

3

この問題は現在廃止されています。ただし、基数を使用しparseIntて他の塩基の数を10 進数に変換することはできます。例えば、

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

を返します17(これはのbase-10です0010001)。


0

ヒント:既にご存じのとおり、デフォルトの8進数は非推奨になりました。レガシーブラウザで修正する方法は次のとおりです

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

PS:(文字列ではなく)先頭に0を付けた定数のみを使用する場合、現在のすべてのブラウザで8として扱われます。
アガメムス2015年

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

=====

推奨プラクティス

そうは言っても、より安全な側面にあり、問題を回避するために、受け入れられた回答で提案されているようにbase / radixパラメーターを使用します

parseInt("09", 10)    // 9

追加テスト

引数が文字列でない場合は、これもテストしたかっただけです。ChromeとSafariでは正確な結果が得られます。Firefoxも適切な結果を返しますが、警告が表示されます。

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

値が0で始まり数値の場合、parseIntは引き続き8を使用します
。parseInt

はい。私も提案された答えを指摘しました。そして、私は避けるべきベストプラクティスと悪い機能を知っています。だから私は私の答えで推奨される練習も与えました。
mythicalcoder
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.