js、jqueryで数値かどうか判定・チェック・確認
非数値チェックのisNaNを"!isNaN"にするとfalseを非数値にできますのでtrueが数値になります。
今回、期待する結果。
今回は数字を求めているので、数値型および文字列型の整数(正の整数・負の整数)・少数(正の少数・負の少数)でtrueを返すことを目指します。
数値型・整数であれば、Number.isInteger()で判別できますね。
数値型および文字列型の整数(正の整数・負の整数)・少数(正の少数・負の少数)であれば、!isNaNが候補に入りますが以下の通り工夫は必要です。
!isNaN(val)だけでは、true、false、null、空配列もtrue判定されるので対策が必要です。絶対にtrue、false、null、空配列が評価対象にならないならこれでもいけそうです。
数値型・文字列型の整数(0を除く)でtrueとなります。0を除く判定ならこれでいけます。
できました。数値型・文字列型の整数(0を含む)でtrueとなります。
こちらも数値型・文字列型の整数(0を含む)でtrueとなります。式が長いですが。
数値型および文字列型の整数(正の整数・負の整数)・少数(正の少数・負の少数)を、parseIntで攻めてみる。
parseIntだけだと0と配列、数字文字列混在への対応が必要となる。
0と数字文字混在が残ってしまう。
0を含めるとこうなる。数字文字混在はいまだ残る。
結局!isNaN登場。!Array.isArray(val)はいらなくなるから上と同じになりました。
これも使えるかな。0を含めない整数・少数(数値型・文字列型問わず)
正規表現でもいけます。さらに条件を絞ることも。
今回目指していた状態です。
正の整数・正の少数のみtrue。
正の整数のみtrue。
!isNaNと正規表現どちらが早い?
10000回の評価を10回施行した結果。
!isNaN
1 : 4.800000ms
2 : 6.100000ms
3 : 11.700000ms
4 : 4.200000ms
5 : 5.100000ms
6 : 4.800000ms
7 : 3.800000ms
8 : 4.000000ms
9 : 13.100000ms
10 : 38.100000ms
regex
0 : 7.500000ms
1 : 3.900000ms
2 : 5.200000ms
3 : 2.700000ms
4 : 2.400000ms
5 : 3.600000ms
6 : 2.400000ms
7 : 2.300000ms
8 : 2.000000ms
9 : 2.500000ms
傾向としては正規表現の方が早そうです。
※Javascriptはユーザー環境で働いていますので、実測値は環境により大きく異なります。今回の計測結果は筆者のPC環境で実行した結果です。
ちなみに普通にifすると。。。こんな感じになります^^