6

入力が数値であるかどうかを評価しようとしているだけisNaNで、最善の方法であると考えました。ただし、これは信頼できない結果を引き起こします。たとえば、次の方法を使用します。

function isNumerical(value) {
    var isNum = !isNaN(value);
    return isNum ? "<mark>numerical</mark>" : "not numerical";
}

これらの値について:

isNumerical(123));     // => numerical
isNumerical("123"));   // => numerical
isNumerical(null));    // => numerical
isNumerical(false));   // => numerical
isNumerical(true));    // => numerical
isNumerical());        // => not numerical

このフィドルに示されています:http://jsfiddle.net/4nm7r/1

なぜisNaNいつもうまくいかないのですか?

4

4 に答える 4

5

isNaNtrue渡された値が数値 (NaN)でない場合 (または、数値に変換できない場合は を返します。したがって、がnulltrue変換falseされ0ます)、それ以外の場合は を返しますfalse。あなたの場合、!関数呼び出しの前に削除する必要があります!

スクリプトの動作を理解するのは非常に簡単です。isNaN値を int に変換できるかどうかを単純にチェックします。これを行うには、1 で乗算または除算するか、0 を減算または加算するだけで済みます。この場合、関数内でalert(value * 1);これらの渡された値がすべて number(0, 1, 123) を除きundefined、その数値はNaNです。

NaNfalse(でも)を返さないため、値を比較することはできません。これNaN === NaNは、NaNが動的に生成されるためだと思います...しかし、よくわかりません。

とにかく、これを行うだけでコードを修正できます。

function isNumerical(value) {
    var isNum = !isNaN(value / 1); //this will force the conversion to NaN or a number
    return isNum ? "<mark>numerical</mark>" : "not numerical";
}
于 2013-06-13T19:19:04.837 に答える
1

他の回答で指摘された逆のロジックを既に修正したので、を使用して、およびparseFloatの誤検知を取り除きます。truefalsenull

var isNum = !isNaN(parseFloat(value));

からの次の種類の出力に注意してparseFloatください。

parseFloat("200$"); // 200
parseFloat("200,100"); // 200
parseFloat("200 foo"); // 200
parseFloat("$200"); // NaN

(つまり、文字列が数字で始まる場合、parseFloat は最初に見つかった数字部分を抽出します)

于 2013-06-13T20:02:02.950 に答える
1

追加のチェックを使用することをお勧めします。

function isNumerical(value) {
    var isNum = !isNaN(value) && value !== null && value !== undefined;
    return isNum ? "<mark>numerical</mark>" : "not numerical";
}

文字列を数値ではないように扱いたい場合123は、もう 1 つチェックを追加する必要があります。

var isNum = !isNaN(value) && value !== null && value !== undefined && (typeof value === 'number');
于 2013-06-13T20:37:23.517 に答える