JavaScriptのNumber
関数は文字列を受け取り、それをパースして数値型の値を返すことができる関数です。文字列から数値型への変換するのに便利です。
Number
は123
や1.23
のような数字だけからなる単純な文字列以外に、様々な文字列フォーマットにも対応しています。そのため、入力文字列のパターンが限定できていない場合、想定外の値になってしまうといった問題に遭遇する可能性があります。
Number
で文字列→数値への変換を行う場合は、Number
の仕様を理解した上で、想定外の結果にならないよう、追加の処理を加えたほうが良さそうです。たとえば、ユーザー入力など、入力文字列のパターンが無数に考えられる文字列を扱う場合は、Number
に渡す前に正規表現などでバリデーションするなど。
空文字列
空の文字列は0
になります。
console.log(Number(""));
//=> 0
空白文字だけからなる文字列
半角スペース、全角スペース、タブなどの空白文字だけからなる文字列は0
になります。
console.log(Number("\t\f\v\u{20}\u{3000}\u{FEFF}"));
//=> 0
// \u{20} ... 半角スペース
// \u{3000} ... 全角スペース
// \u{FEFF} ... Zero Width No-Break Space (BOM, ZWNBSP)
前後に空白文字がある文字列
前、うしろ、または、前後に空白文字は無視されます。
console.log(Number(" 1 "));
//=> 1
符号
+
や-
の符号がついたものもパースできます。
console.log(Number("-1")); //=> -1
console.log(Number("+1")); //=> 1
console.log(Number("-0")); //=> -0
console.log(Number("+0")); //=> 0
2進数表記
0b
または0B
ではじまる2進数表記の文字列がパースできます。
console.log(Number("0b10"));
//=> 2
8進数表記
0o
または0O
ではじまる8進数表記の文字列がパースできます。
console.log(Number("0o10"));
//=> 8
16進数表記
0x
または0X
ではじまる16進数表記の文字列がパースできます。
console.log(Number("0x10"));
//=> 16
Infinity
文字列"Infinity"
は、数値型のInfinity
になります。
console.log(Number("Infinity"));
//=> Infinity
小数
console.log(Number("1.1"));
//=> 1.1
ドットで始まる文字列
.
で始まり、数字が続く文字列は小数としてパースされます。
console.log(Number(".1"));
//=> 0.1
指数表記
e2
、e-2
、e+2
などの指数表記がパースできます。
console.log(Number("1e2")); //=> 100
console.log(Number("1e+2")); //=> 100
console.log(Number("1e-2")); //=> 0.01
組み合わせ
上のいろいろを組み合わせた場合もパースできるパターンがあります。
// 16進数表記 + 前後空白文字
console.log(Number("\u{3000}0x10\r\n"));
//=> 16
// 符号 + ドット始まり小数 + 指数表記
console.log(Number("-.123e+2"));
//=> -12.3
// 符号 + Infinity + 空白文字
console.log(Number("-Infinity\t"));
//=> -Infinity