JavaScript で小数を検証する - IsNumeric() 質問する

JavaScript で小数を検証する - IsNumeric() 質問する

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

ベストアンサー1

@ジョエルの回答かなり近いですが、次の場合には失敗します。

// 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);
}

追伸 非数有限である強制的に数値に変換されるため、混乱を招く動作をします。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));
}

おすすめ記事