parseInt()

parseInt() は、文字列の引数を解析し、指定された基数 (数学的記数法の底) の整数値を返します。

構文

parseInt(string [, radix])

引数

string
解析する値。この引数が文字列でない場合、抽象操作 ToString を用いて文字列に変換されます。この引数では先頭のホワイトスペースは無視されます。
radix 省略可
2 から 36 までの整数で、string基数 (数学的記数法の底) を表します。これは既定値が 10 ではないので注意してください。
下記の解説では、radix が提供されなかった場合に何が起こるかをもっと詳細に説明しています。

返値

指定された string を解析した整数値です。

また、下記の場合は NaN が返されます。

  • radix2 よりも小さいか 36 よりも大きい、または r
  • 最初のホワイトスペース以外の文字が数値に変換できない。

解説

parseInt 関数は第1引数を文字列に変換し、解析したうえで、整数または NaN を返します。

返値は NaN でない場合は、第1引数を指定された radix で数値として解釈した整数値になります。(例えば、radix10 であれば 10進数からの変換で、8 であれば 8進数からの変換で、16 であれば 16進数からの変換、などです。)

10 以上の基数については、9 より大きい数字はアルファベットで示されます。たとえば、16進数(基数 16) では A から F が用いられます。

parseInt 関数は指定された radix における数字ではない文字に出会うと、それ以降の文字を無視し、その時点で解析された整数値を返します。parseInt は数値を整数に切り捨てます。前後に空白があっても構いません。

数値によっては e の文字を文字列表現の中で使用しますので (例えば 6.022e23 は 6.022 × 1023 を表します)、parseInt を使用して数値を切り捨てると、とても大きな数字やとても小さな数字を使用する際に予期しない結果を生み出すことがあります。parseIntMath.floor() の代用として使うべきではありません

parseInt は 2 つの符号を正確に理解します。+ は正の符号で、- は負の符号です (ECMAScript 1 より)。これは解析の最初の段階で、ホワイトスペースを除去した後に行われます。符号が見つからなかった場合は、アルゴリズムは次の段階に移行します。そうでなければ、符号を取り除いて残りの文字列の数値の解析を実行します。

radixundefined, 0, または指定されなかった場合、JavaScript 以下のように仮定します。

  1. 入力した string が "0x" または "0X" (ゼロに続いて小文字または大文字の X) で始まった場合は、radix16 と仮定され、残りの文字列が 16進数として解釈されます。
  2. 入力した string が "0" (ゼロ) で始まった場合は、radix8 (8進数) または 10 (10進数) と仮定されます。厳密にどちらの基数が選択されるかは実装に依存します。ECMAScript 5 では 10 (10進数) を使用するべきだと明示していますが、まだすべてのブラウザーが対応している訳ではありません。したがって、parseInt関数を使うときは radix を常に指定してください
  3. 入力した string がその他の値で始まるときは、基数は 10 (10進数) となります。

初めの文字が数値に変換できないときは、parseIntNaN を返します。

数値演算の目的では、NaN は基数がいくつであっても数値にはなりません。isNaN 関数を使うと、parseInt の結果が NaN であるかどうか確かめられます。数値演算で NaN が与えられると、演算結果も NaN になります。

数値を特定の基数で文字列リテラルに変換したいときは、thatNumber.toString(radix) を使用してください。

BigInt の警告: parseIntBigIntNumber へ変換するので、その処理中に精度が落ちます。これは後に付く数値ではない値が、"n" を含めて、切り落とされるからです。

基数を指定しない 8進数の解釈

ECMAScript 3 で非推奨となり、ECMAScript 5 で廃止されたものの、多くの実装が 0 で始まる数字の文字列を 8進数として解釈します。以下の式は 8進数とされることもあれば、10進数で扱われることもあります。つねに radix を指定すれば、信頼できない動作を防ぐことができます

parseInt('0e0')  // 0
parseInt('08')   // '8' は 8進数では用いられないため、0。

ECMAScript 5 仕様書において parseInt 関数は、0 の文字で始まる文字列を 8進数として扱うことをもはや実装に認めなくなりました。

ECMAScript 5 では次のように宣言しています。

parseInt関数は、文字列引数の内容を指定された基数によって解釈した整数値を生成します。文字列の先頭のホワイトスペースは無視されます。基数が undefined または 0 である場合は 10 と仮定されますが、数値が 0x または 0X の 2文字で始まる場合は例外で、この場合は基数が 16 と仮定されます。

これは、ECMAScript 3 が 8進数の解釈を非推奨 (ただし許容) としていたのとは異なります。

2013年現在、多くの実装はまだこの仕様に対応していません。そして、古いブラウザーの対応が必要なので、つねに基数を指定してください

より厳密な解析関数

場合によっては、値の整数への解析により厳密な方法を採るのも有効でしょう。

正規表現が役立ちます。

function filterInt(value) {
  if (/^[-+]?(\d+|Infinity)$/.test(value)) {
    return Number(value)
  } else {
    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

parseInt の使用

以下の例はいずれも 15 を返します。

parseInt('0xF', 16)
parseInt('F', 16)
parseInt('17', 8)
parseInt(021, 8)
parseInt('015', 10)    // ただし `parseInt(015, 10)` は 13 を返す
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進数では 0 または 1 以外の数字は無効

以下の例はいずれも -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 になる

以下の例は 1e+21(基数を含む) より大きいか、1e-7(基数を含む) より小さい場合は 1 を返します。(基数 10 を使用している場合)。

parseInt(0.0000001,10);
parseInt(0.000000123,10);
parseInt(1e-7,10);
parseInt(1000000000000000000000,10);
parseInt(123000000000000000000000,10);
parseInt(1e+21,10);

以下の例は 224 を返します。

parseInt('0e0', 16)

BigInt の値は精度が落ちます。

parseInt('900719925474099267n')
// 900719925474099300

parseInt数字の区切り文字は機能しません。

parseInt('123_456')
// 123

仕様

仕様書
ECMAScript (ECMA-262)
parseInt の定義

ブラウザーの互換性

BCD tables only load in the browser

関連情報