文字列を数値に変換する

Number() と parseInt() と単項プラスは、失敗したときの振る舞いが違います。空文字・全角・単位つき・カンマ区切りで何が起きるかを実行して確かめ、安全な書き方をまとめます。

実行して検証済み処理系Node 22.22.3対応ES1難易度●●○○○目安9更新

答え

Number() を使い、空文字を先に弾き、変換できたかを確かめます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
42 3.14 null null
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
"42" Number: 42 parseInt: 42 parseFloat: 42 "3.14" Number: 3.14 parseInt: 3 parseFloat: 3.14 "42px" Number: NaN parseInt: 42 parseFloat: 42 "" Number: 0 parseInt: NaN parseFloat: NaN " 7 " Number: 7 parseInt: 7 parseFloat: 7 "あ" Number: NaN parseInt: NaN parseFloat: NaN "0x1f" Number: 31 parseInt: 0 parseFloat: 0 "1e3" Number: 1000 parseInt: 1 parseFloat: 1000

関門は2つあります。

  • 空文字を先に弾くNumber('')NaN ではなく0になる
  • Number.isFinite() で確かめるNaNInfinity もまとめて落ちる

どちらも省くと静かに壊れます。理由はこのあと順に見ます。

上のコードは書き換えて実行できます。'42px'' 42 ' にしてみてください。

3つのやり方の違い

javascript
console.log(Number(''));
console.log(Number(' '));
console.log(Number(null));
console.log(Number([]));
console.log(Number(false));
0 0 0 0 0
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
null null 0
全体が数値でないとき 空文字 小数点
Number() NaN(厳しい) 0 になる 読む
parseInt() 読める所まで読む NaN 切り捨てる
parseFloat() 読める所まで読む NaN 読む

入力の検証には Number() を使ってください。 parseInt()'42px'42 として通してしまいます。

空文字が 0 になる

Number() のいちばんの落とし穴です。未入力が 0 として通ります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
42 42 0 0 NaN NaN
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
31 0 8 8

フォームの未入力は空文字で届きます。そのまま Number() に渡すと 「0 と入力された」と区別できません

javascript
console.log(Number('1,234'));
console.log(Number('123'));
console.log(Number('123'));
NaN NaN NaN
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
1234 123 123 1234

先に空かどうかを見れば、「未入力」と「0 と入力」を区別できます。

単項プラスは Number() と同じ

+text は短く書けますが、中身は Number() です。空文字も 0 になります。

javascript
const text = '9007199254740993';

console.log(Number(text));
console.log(String(Number(text)) === text);
9007199254740992 false
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
9007199254740993n true

短いぶん、変換していることが読み取りにくくなります。人が読むコードでは Number() を勧めます。

parseInt には必ず基数を渡す

第2引数を省くと、2文字目までを見て基数を決めます。

javascript
console.log(isNaN('あ'));
console.log(isNaN(''));
console.log(Number.isNaN(Number('')));
true false false
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
"42" 42 "3.14" 3.14 "" null " " null "42px" null "あ" null "1e3" 1000 "Infinity" null

'0x1f'16進数とみなされて 31 になります。 '08' は現在の仕様では10進数ですが、古い環境では8進数として 0 になりました。

parseInt(s, 10) と必ず書いてください。

カンマ区切りと全角

そのままでは通りません。先に整えます。

全角数字は1文字でも混ざると変換できません。 カンマも同じです。

日本語の入力欄では全角で打たれるのが普通です。 「数字を入れてください」と書いても、全角で来ます。受け取る側で直してください。

全角の記号は種類が多いので、扱う範囲を決めて明示的に置き換えてください。何でも受け付けようとすると、かえって読めなくなります。

区切って複数の数値を受け取るなら String.prototype.split() と組み合わせます。

大きすぎる数

16桁を超えると、変換できても元に戻りません

ID や電話番号のような「計算しない数字」は、数値に変換しないでください。 文字列のまま扱うのが正解です。

計算が必要なら BigInt を使います。

理由は なぜ 0.1 + 0.2 は 0.30000000000000004 になるのか にあります。

NaN の判定に isNaN() を使わない

グローバルの isNaN()先に数値へ変換します。別の質問に答えてしまいます。

Number.isNaN()Number.isFinite() を使ってください。 詳しくは なぜ NaN === NaN は false なのか にあります。

まとめ

  • 変換には Number()parseInt() は途中まで読んでしまう)
  • 空文字を先に弾くNumber('')0
  • Number.isFinite() で確かめるNaNInfinity も落ちる)
  • parseInt() を使うときは必ず基数を渡す
  • 計算しない数字(ID・電話番号)は変換しない

この記事の根拠

  1. Number ( value ) — ECMAScript® 2026 Language Specificationtc39.es
  2. parseInt ( string, radix ) — ECMAScript® 2026 Language Specificationtc39.es
  3. Number() コンストラクター — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)