JavaScript では、Number()で数値以外の文字列を数値に変換しようとすると、関数はNaNを返します。NaNをtypeof演算子で判定しようとしても’number’と判定されて上手く行きません。テキストボックスから入力された値をgetElementByIdで受け取るときに、数値か文字列かを判定するには isFinite関数を使って
if (isFinite(arg)) { (処理) } else { alert('半角数値を入力してください!'); return false; }
と例外処理します。
値 | 変換先 | |||
文字列 | 数値 | 論理値 | オブジェクト | |
undifined null |
“undifined” “null” |
NaN 0 |
false false |
TypeError 例外 TypeError 例外 |
true false |
“true” “false” |
1 0 |
new Boolean(true) new Boolean(false) |
|
“”(空文字列) “1.2”(数値文字列) “one” (数値以外の文字列) |
0 1.2 NaN |
false true true |
new String(“”) new String(“1.2”) new String(“one”) |
|
0 -0 NaN Infinity -Infinity 1(有限値, 0以外) |
“0” “0” “NaN” “Infinity” “-Infinity” “1” |
false false false true true true |
new Number(0) new Number(-0) new Number(NaN) new Number(Infinity) new Number(-Infinity) new Number(1) |
追記)JavaScript Good Parts 「良いパーツによるベストプラクティス」に興味深い記述がありましたので転載します。
JavaScript は、isNaN 関数を提供しており、これを使えば数値とNaN を区別することができる。
isNaN(NaN) // true
isNaN(0) // false
isNaN(‘oops’) // true
isNaN(‘0’) // false
isFinite 関数は値が利用可能な数値であるかを調べるもっともよい方法だ。なぜならこの関数は、NaN と Infinity をどちらも false と判断してくれるからである。しかし、残念なことに、isFinite は与えられたオペランドをまず数値に変換しようとしてしまう。したがって調べたい値が数値型ではなかった場合には、これは良いテスト方法とは言えない。もしかしたらあなたは、isNumber 関数を自分で定義したくなるかもしれない。
var isNumber = function isNumber(value) { return typeof value === 'number' && isFinite(value); };