0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

文字列を数値に変換する4つの方法、挙動の違い5選

0
Posted at

JavaScriptで文字列を数値に変換する方法は複数あります。Number()・parseInt()・parseFloat()・単項プラス演算子(+)の4つです。「どれも似たようなもの」と思っていると、入力する文字列によって結果が食い違い、思わぬバグにつながることがあります(以前扱った||と??の話は演算子のデフォルト値処理の違いでしたが、今回は文字列から数値への変換メソッドそのものの違いです)。実際にNode.jsで検証しながら、5つの挙動差を紹介します。

検証結果一覧

いくつかの文字列を、4つの方法でそれぞれ変換してみました。

const tests = ["42", "42px", "3.14", "", "  42  ", "0x1A", "42abc"];

for (const t of tests) {
  console.log(`"${t}" →`, Number(t), parseInt(t), parseFloat(t), +t);
}

結果は次のようになりました(左からNumber() / parseInt() / parseFloat() / +)。

"42"     → 42 / 42 / 42 / 42
"42px"   → NaN / 42 / 42 / NaN
"3.14"   → 3.14 / 3 / 3.14 / 3.14
""       → 0 / NaN / NaN / 0
"  42  " → 42 / 42 / 42 / 42
"0x1A"   → 26 / 26 / 0 / 26
"42abc"  → NaN / 42 / 42 / NaN

挙動差5選

①末尾に余計な文字がついていると、Number()と+はNaNになる

"42px"や"42abc"のように、数字の後ろに文字が続いていると、Number()と単項+は変換をあきらめてNaNを返します。一方parseInt()とparseFloat()は「読める部分まで」を読み取って42を返します。CSSの"42px"のような値をそのまま数値に変換しようとしてNaNに遭遇するのは、この挙動の典型例です。

②空文字はNumber()と+だと0になる

""(空文字)を渡すと、Number()と単項+は0を返しますが、parseInt()とparseFloat()はNaNを返します。「入力が空だったらエラーにしたい」という場面でNumber()を使うと、空文字が静かに0として処理されてしまい、バリデーション漏れの原因になります。

③前後の空白は自動的に無視される

" 42 "のように前後に空白があっても、4つの方法すべてで正しく42として変換されます。空白の扱いについては、この4つで差はありません。

④小数点以下の扱いがparseInt()だけ違う

"3.14"を渡すと、Number()・parseFloat()・+はそのまま3.14を返しますが、parseInt()だけは小数点以下を切り捨てて3を返します。parseInt()は名前の通り「整数(integer)」に変換する関数なので、小数点以下を保持したい場面では不向きです。

⑤16進数表記はparseFloat()だけ認識しない

"0x1A"(16進数で26を表す文字列)を渡すと、Number()・parseInt()・+は正しく26に変換しますが、parseFloat()だけは0を返します。parseFloat()は「小数点を含む数値」の解析に特化しているため、0xという16進数プレフィックスを認識できず、0の直後で読み取りを止めてしまいます。

使い分けの目安

方法 向いている場面
Number() 文字列全体が完全に数値である前提で、余計な文字が混ざっていたらNaNを検知してエラー扱いにしたい時
parseInt() "42px"のように単位付きの文字列から整数部分だけ取り出したい時
parseFloat() 単位付きの文字列から小数を含む数値部分を取り出したい時(16進数は扱わない)
+(単項プラス) Number()とほぼ同じ挙動。短く書きたい時に使われる

AIが生成したコードで、ユーザー入力を数値に変換する処理を見かけたら、Number()系(厳密判定)とparseInt()系(緩い抽出)のどちらが使われているかを確認してみてください。特に空文字や単位付き文字列が入力される可能性がある場面では、選び方次第でバリデーションの穴になり得ます。


未経験者向けの講座を運営しています

未経験から Next.js + Supabase + Claude Code で Webアプリを公開するまで を、全24セッションで体系化した教材です。Claude Code を学習パートナーにする CLAUDE.md と学習モード(learner / developer)の設計までセットで含みます。

※ 中上級者には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?