【JavaScript】文字列を数値型に変換する方法|Number・parseInt・parseFloat・単項+の違いとNaN・全角・空文字の罠まで解説

JavaScriptでは、フォーム入力やURLパラメータなどから受け取った値は基本的に文字列です。そのまま計算すると "3" + 4"34" になるなど意図しない結果になるため、計算前に数値型へ変換する必要があります。

変換方法は Number()・単項 + 演算子・parseInt()parseFloat() の4通りが基本です。それぞれ「末尾に文字が混じったとき」「空文字のとき」などで挙動が異なり、Number("")0 になる、全角数字が NaN になるといった落とし穴もあります。この記事では使い分けと注意点、安全な変換のしかたまで解説します。

この記事の結論:厳密に数値だけを変換したいなら Number() または単項 +、「12px」のように末尾に単位が付く文字列から数値を取り出すなら parseInt()基数を必ず指定)/ parseFloat() を使います。変換後は Number.isNaN() で失敗チェックを入れるのが安全です。
スポンサーリンク

Number() で変換する(最も基本)

Number() は文字列全体を数値として解釈します。整数・小数・指数表記・16進数なども扱えますが、数値として読めない文字が混じると NaN になります。

Number() の基本
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(全体が数値でない)
空文字・空白は 0 になります。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」のように単位が付いた文字列から数値を取り出すのに便利です。

parseInt() の基本
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 とは異なる!)
第2引数の基数(radix)を必ず指定してください。省略すると先頭が 0x の文字列が16進数と解釈されるなど、環境依存の意図しない結果になります。通常は parseInt(str, 10) と10進数を明示します。(例:parseInt("0x1F")31parseInt("11", 2)3

parseFloat() で小数に変換する

parseFloat()parseInt() の小数版です。先頭から数値(小数を含む)として読める部分までを変換します。基数の指定はありません。

parseFloat() の基本
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)

QNumber() と parseInt() はどちらを使うべきですか?
A文字列全体が数値か厳密に見たいなら Number()(または単項 +「12px」のように末尾に余計な文字がある文字列から数値を取り出したいなら parseInt() です。Number("12px")NaN ですが parseInt("12px", 10)12 を返します。
QparseInt() の第2引数(基数)は省略してもいいですか?
A省略しないでください。先頭が 0x の文字列が16進数と解釈されるなど、意図しない結果になることがあります。10進数として扱うなら必ず parseInt(str, 10) と書きます。
QNumber(“”) が 0 になるのはなぜですか?対策は?
A仕様上、空文字や空白のみの文字列は 0 に変換されます。未入力を 0 と誤認しないよう、value.trim() === "" を先にチェックするか、記事内の toNumber() のように空文字をフォールバック値に振り分けると安全です。
Q変換結果が NaN かどうかを確認するには?
ANumber.isNaN(値) を使います。古い isNaN() は引数を数値化してから判定するためisNaN("abc")true になるなど紛らわしく、Number.isNaN() の方が厳密で安全です。

まとめ

JavaScriptで文字列を数値型に変換する方法のポイントを整理します。

  • 厳密な変換は Number() / 単項 +(全体が数値でないと NaN
  • 末尾に単位がある文字列からの抽出は parseInt(str, 10) / parseFloat(str)
  • parseInt() は基数を必ず指定Number("") は 0 になる罠に注意
  • 全角数字・カンマ区切りは NaN → 事前に正規化・除去する
  • 変換失敗は Number.isNaN() で判定し、フォールバックを用意すると安全

反対に数値を文字列に変換する方法や、数値に変換できるか判定する方法文字列から数値だけを取り出す方法もあわせて確認すると理解が深まります。