JavaScriptでは、フォーム入力やURLパラメータなどから受け取った値は基本的に文字列です。そのまま計算すると "3" + 4 が "34" になるなど意図しない結果になるため、計算前に数値型へ変換する必要があります。
変換方法は Number()・単項 + 演算子・parseInt()・parseFloat() の4通りが基本です。それぞれ「末尾に文字が混じったとき」「空文字のとき」などで挙動が異なり、Number("") が 0 になる、全角数字が NaN になるといった落とし穴もあります。この記事では使い分けと注意点、安全な変換のしかたまで解説します。
Number() または単項 +、「12px」のように末尾に単位が付く文字列から数値を取り出すなら parseInt()(基数を必ず指定)/ parseFloat() を使います。変換後は Number.isNaN() で失敗チェックを入れるのが安全です。Number() で変換する(最も基本)
Number() は文字列全体を数値として解釈します。整数・小数・指数表記・16進数なども扱えますが、数値として読めない文字が混じると NaN になります。
console.log(Number("123")); // 123
console.log(Number("123.45")); // 123.45
console.log(Number("1e3")); // 1000(指数表記)
console.log(Number("0x1F")); // 31(16進数)
console.log(Number("123abc")); // NaN(全体が数値でない)
Number("") も Number(" ") も 0 を返すため、未入力を「0」と誤って扱ってしまう事故が起きがちです。空文字は変換前にチェックしましょう(後述の安全な変換を参照)。単項プラス(+)演算子で変換する
文字列の前に + を付けるだけで数値に変換できます。挙動は Number() と同じで、短く書けるためよく使われます。
console.log(+"123"); // 123 console.log(+"123.45"); // 123.45 console.log(+""); // 0(Number() と同じ挙動) console.log(+"123abc"); // NaN
parseInt() で整数に変換する(基数を必ず指定)
parseInt() は文字列の先頭から数値として読める部分までを整数に変換します。「12px」のように単位が付いた文字列から数値を取り出すのに便利です。
console.log(parseInt("123", 10)); // 123
console.log(parseInt("12px", 10)); // 12(先頭の数値部分だけ)
console.log(parseInt("3.14", 10)); // 3(整数化・切り捨てではなく解析を止める)
console.log(parseInt("abc", 10)); // NaN
console.log(parseInt("", 10)); // NaN(Number("")=0 とは異なる!)
0x の文字列が16進数と解釈されるなど、環境依存の意図しない結果になります。通常は parseInt(str, 10) と10進数を明示します。(例:parseInt("0x1F") は 31、parseInt("11", 2) は 3)parseFloat() で小数に変換する
parseFloat() は parseInt() の小数版です。先頭から数値(小数を含む)として読める部分までを変換します。基数の指定はありません。
console.log(parseFloat("123.45")); // 123.45
console.log(parseFloat("1.5kg")); // 1.5(単位を無視)
console.log(parseFloat("3.14.15")); // 3.14(2つ目の . で止まる)
console.log(parseFloat("abc")); // NaN
4つの方法の違い
同じ入力でも結果が変わります。代表的なケースを比較します。
| 入力 | Number(x) |
+x |
parseInt(x,10) |
parseFloat(x) |
|---|---|---|---|---|
"123" |
123 | 123 | 123 | 123 |
"123.45" |
123.45 | 123.45 | 123 | 123.45 |
"12px" |
NaN | NaN | 12 | 12 |
""(空文字) |
0 | 0 | NaN | NaN |
"abc" |
NaN | NaN | NaN | NaN |
Number() / 単項 +、「12px」のように末尾の単位を無視して数値を取り出したいなら parseInt() / parseFloat() です。変換でハマりやすい落とし穴
console.log(Number("")); // 0(空文字が0になる)
console.log(Number(" ")); // 0(空白だけも0)
console.log(Number("1,000")); // NaN(カンマ区切りは不可)
console.log(Number("123")); // NaN(全角数字は変換されない)
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
console.log(Number(true)); // 1
Number("1,000".replace(/,/g, "")) のようにカンマを除去してから変換します。全角数字は半角へ正規化してから変換します(例:"123".replace(/[0-9]/g, c => String.fromCharCode(c.charCodeAt(0) - 0xFEE0)))。Number が正確に扱えるのは Number.MAX_SAFE_INTEGER(9007199254740991)までです。それを超える桁の数値文字列は BigInt("123...") を使ってください。NaN の判定と安全な変換
変換に失敗すると NaN になります。判定には Number.isNaN() を使います(古い isNaN() は文字列を数値化してから判定するため誤判定しやすく、非推奨です)。
// 失敗時はフォールバック値を返す堅牢な変換
function toNumber(value, fallback = 0) {
if (typeof value !== "string" || value.trim() === "") return fallback;
const n = Number(value);
return Number.isNaN(n) ? fallback : n;
}
console.log(toNumber("123")); // 123
console.log(toNumber("abc")); // 0(フォールバック)
console.log(toNumber("", 100)); // 100(空文字はフォールバック)
console.log(toNumber("12.5", 0)); // 12.5
実用例:フォーム入力を数値として扱う
入力欄の値は文字列なので、計算前に数値化し、失敗をチェックします。
const raw = document.getElementById("price").value; // 例: "1980"
const price = Number(raw);
if (Number.isNaN(price)) {
console.log("数値を入力してください");
} else {
console.log(price * 1.1); // 税込み計算など
}
よくある質問(FAQ)
Number()(または単項 +)、「12px」のように末尾に余計な文字がある文字列から数値を取り出したいなら parseInt() です。Number("12px") は NaN ですが parseInt("12px", 10) は 12 を返します。0x の文字列が16進数と解釈されるなど、意図しない結果になることがあります。10進数として扱うなら必ず parseInt(str, 10) と書きます。0 に変換されます。未入力を 0 と誤認しないよう、value.trim() === "" を先にチェックするか、記事内の toNumber() のように空文字をフォールバック値に振り分けると安全です。Number.isNaN(値) を使います。古い isNaN() は引数を数値化してから判定するためisNaN("abc") が true になるなど紛らわしく、Number.isNaN() の方が厳密で安全です。まとめ
JavaScriptで文字列を数値型に変換する方法のポイントを整理します。
- 厳密な変換は
Number()/ 単項+(全体が数値でないとNaN) - 末尾に単位がある文字列からの抽出は
parseInt(str, 10)/parseFloat(str) parseInt()は基数を必ず指定、Number("")は 0 になる罠に注意- 全角数字・カンマ区切りは
NaN→ 事前に正規化・除去する - 変換失敗は
Number.isNaN()で判定し、フォールバックを用意すると安全
反対に数値を文字列に変換する方法や、数値に変換できるか判定する方法、文字列から数値だけを取り出す方法もあわせて確認すると理解が深まります。
