parseInt()は、第1引数の文字列を解析(パース)し、第2引数に与えられた基数(数学的記数法の底)にもとづく整数を返します。
構文
parseInt(string, radix);
引数
string- 解析する値。引数
stringが文字列でなければ、(抽象操作ToStringにより)文字列に変換されます。このとき、値の始まりの空白文字は無視されます(「ECMAScript® 2015 Language Specification」18.2.5「parseInt (string , radix)」参照)。
radix- 2から36までの整数で、前述の文字列に対する基数(数学的記数法の底)を与えます。一般に使われる10進法には、
10を定めます。この引数を必ず渡すことにより、誤解を防ぎ、意図した動作が導けます。基数が与えられない場合、実装が異なれば異なる結果になりますが、通常は10です。
戻り値
与えられた文字列を解析した整数値です。最初の文字を数値に変換できない場合、NaN が返されます。
説明
parseInt()関数は第1引数を文字列に変換し、解析したうえで、整数またはNaNを返します。戻り値は、NaNでなければ、第1引数のstringを第2引数radixの基数によって示す10進数の整数です。たとえば、radixが10なら10進数、8は8進数、16であれば16進数による変換を意味します。10以上の基数については、9より大きい数字はアルファベットで示されます。たとえば、16進数(基数16)ではAからFが用いられます。
parseInt()関数が第1引数の文字列の中に第2引数の基数で数字とされない文字を認めると、それ以降の文字は無視され、そこまでの値を解析した整数値が返されます。parseInt()関数は数値を整数に切り捨てます。第1引数の文字列の前と後の半角スペースは無視されます。
第2引数のradixがundefinedか0の(または与えられていない)場合は、JavaScriptはつぎのように解釈します。
- 第1引数の
stringが「0x」または「0X」で始まるときは、第2引数のradixは16(16進法)としてその後の文字列を解析します。 - 第1引数の
stringが「0」で始まるときは、第2引数のradixは8(8進法)または10(10進法)とされます。厳密には、基数がどちらになるかは実装によります。ECMAScript 5 の仕様では10(10進法)です。ただし、まだすべてのブラウザがサポートしている訳ではありません。したがって、parseInt()関数を使うとき基数は必ず与えてください。 - 第1引数の
stringがその他の値で始まるときは、第2引数のradixは10(10進法)とされます。
第1引数の初めの文字が数値に変換できないときは、parseInt()関数はNaNを返します。
数値演算をしようとしたとき、NaNは基数がいくつであっても数値にはなりません。isNaN関数を使うと、parseInt()関数の戻り値がNaNであるかどうか確かめられます。数値演算でNaNが与えられると、演算結果はNaNになります。
数値を一定の基数で文字列リテラルに変換したいときは、intValue.toString(radix)を用います。
例
parseInt()関数の使い方
以下の例はいずれも15を返します。
parseInt(' 0xF', 16);
parseInt(' F', 16);
parseInt('17', 8);
parseInt(021, 8);
parseInt('015', 10); // parseInt(015, 10); は 15 を返す。
parseInt(15.99, 10);
parseInt('15,123', 10);
parseInt('FXX123', 16);
parseInt('1111', 2);
parseInt('15 * 3', 10);
parseInt('15e2', 10);
parseInt('15px', 10);
parseInt('12', 13);
以下の例はいずれもNaNを返します。
parseInt('Hello', 8); // まったく数字ではない
parseInt('546', 2); // 各桁の数字が2進数に適さない
以下の例はいずれも-15を返します。
parseInt('-F', 16);
parseInt('-0F', 16);
parseInt('-0XF', 16);
parseInt(-15.1, 10)
parseInt(' -17', 8);
parseInt(' -15', 10);
parseInt('-1111', 2);
parseInt('-15e1', 10);
parseInt('-12', 13);
以下の例はいずれも4を返します。
parseInt(4.7, 10); parseInt(4.7 * 1e22, 10); // 非常に大きな数によって 4 になる parseInt(0.00000000000434, 10); // 非常に小さな数によって 4 になる
以下の例は224を返します。
parseInt('0e0', 16);
基数を与えない8進数の解釈
ECMAScript 3では推奨されず、ECMAScript 5で認められなくなったものの、多くの実装は0で始まる数字の文字列を8進数として解釈します。以下の式は8進数とされることもあれば、10進数で扱われることもあります。つねに基数を与えれば、予想しない動きが防げます。
parseInt('0e0'); // 0
parseInt('08'); // 0, "8"は8進数では用いられない。
ECMAScript 5は8進数の解釈を削除
ECMAScript 5仕様におけるparseInt()関数は、文字0で始まる文字列を8進数として扱うことはもはや認めない実装になりました。ECMAScript 5仕様はつぎのように述べます。
parseInt関数は、引数stringの内容について与えられたradixにより解釈して定められた整数値を生成します。値の始まりの空白文字は無視されます。radixがundefinedまたは0のときは、10とみなされます。ただし、数字の初めのふた文字が0xまたは0Xの場合には、radixは16として扱われます。
これは、ECMAScript 3が推奨はしなかったものの8進数の解釈を認めていたのと異なります。
2013年現在、多くの実装はまだこの仕様を採り入れていません。したがって、古いブラウザに対応するためには、つねに第2引数に基数を与えてください。
より厳密な解析関数
場合によっては、値の整数への解析により厳密な方法を採るのも有効でしょう。正規表現が役立ちます。
var filterInt = function (value) {
if(/^(\-|\+)?([0-9]+|Infinity)$/.test(value))
return Number(value);
return NaN;
}
console.log(filterInt('421')); // 421
console.log(filterInt('-421')); // -421
console.log(filterInt('+421')); // 421
console.log(filterInt('Infinity')); // Infinity
console.log(filterInt('421e+0')); // NaN
console.log(filterInt('421hop')); // NaN
console.log(filterInt('hop1.61803398875')); // NaN
console.log(filterInt('1.61803398875')); // NaN
仕様
| Specification | Status | Comment |
|---|---|---|
| ECMAScript 1st Edition (ECMA-262) | 標準 | 初期定義 |
| ECMAScript 5.1 (ECMA-262) parseInt の定義 |
標準 | |
| ECMAScript 2015 (6th Edition, ECMA-262) parseInt の定義 |
標準 | |
| ECMAScript Latest Draft (ECMA-262) parseInt の定義 |
ドラフト |
ブラウザの互換性
| 機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | ? | (有) |
| 0で始まる文字列を8進法ではなく10進法として解析 | (有) | 21 | (有) (in standards mode) | ? | (有) |
| 機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |
| 0で始まる文字列を8進法ではなく10進法として解析 | ? | ? | 21 | ? | ? | ? |