1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptで10進数を検証する - IsNumeric()

2022-03-18 10:50:51

質問

JavaScriptで小数を検証するための最もクリーンで効果的な方法は何ですか?

ボーナスポイント

  1. 明確であること。ソリューションはクリーンでシンプルであるべきです。
  2. クロスプラットフォームであること。

テストケース

01. IsNumeric('-1')      => true
02. IsNumeric('-1.5')    => true
03. IsNumeric('0')       => true
04. IsNumeric('0.42')    => true
05. IsNumeric('.42')     => true
06. IsNumeric('99,999')  => false
07. IsNumeric('0x89f')   => false
08. IsNumeric('#abcdef') => false
09. IsNumeric('1.2.3')   => false
10. IsNumeric('')        => false
11. IsNumeric('blah')    => false

解決方法は?

ジョエルさんの回答 はかなり近いですが、以下の場合は失敗します。

// Whitespace strings:
IsNumeric(' ')    == true;
IsNumeric('\t\t') == true;
IsNumeric('\n\r') == true;

// Number literals:
IsNumeric(-1)  == false;
IsNumeric(0)   == false;
IsNumeric(1.1) == false;
IsNumeric(8e5) == false;

しばらく前、私は IsNumeric 関数で、変数に数値が含まれているかどうかを調べることができます。 型に関係なく である可能性があります。 String を含む数値(指数表記なども考慮する必要がありました)。 Number オブジェクトなど、事実上どんなものでもその関数に渡すことができますが、型の強制には気を配りながら、型を仮定することはできませんでした(例. +true == 1; しかし true とはみなされないはずです。 "numeric" ).

私は、このセットを共有する価値があると思います。 +30のユニットテスト を多数の関数実装に適用し、すべてのテストに合格したものを共有します。

function isNumeric(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

追伸 isNaN & isFinite は、強制的に数値に変換されるため、混乱した動作をします。ES6では 数.isNaN &です。 数.isFinite を使えば、これらの問題を解決することができます。使用する際は、その点に注意してください。


更新情報 : 現在のjQueryの動作は以下の通りです(2.2-stable)。 :

isNumeric: function(obj) {
    var realStringObj = obj && obj.toString();
    return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0;
}

更新情報 : アンギュラー4.3 :

export function isNumeric(value: any): boolean {
    return !isNaN(value - parseFloat(value));
}