ifステートメントなしでNaN値を0に変換する方法はありますか。
if (isNaN(a)) a = 0;
毎回変数をチェックするのはとても面倒です。
function noNaN( n ) { return isNaN( n ) ? 0 : n; }その後、ちょうどnoNaN( a )
ifステートメントなしでNaN値を0に変換する方法はありますか。
if (isNaN(a)) a = 0;
毎回変数をチェックするのはとても面倒です。
function noNaN( n ) { return isNaN( n ) ? 0 : n; }その後、ちょうどnoNaN( a )
回答:
あなたはこれを行うことができます:
a = a || 0
...を「偽の」値からに変換し0ます。
「false」の値は次のとおりです。
falsenullundefined0"" (空の文字列)NaN (数字ではない)またはこれを希望する場合:
a = a ? a : 0;
...上記と同じ効果があります。
目的が以外のものもテストすることである場合NaN、同じことを実行できますが、最初にtoNumber変換を実行します。
a = +a || 0
これは、単項+演算子を使用aして数値に変換しようとします。これには、数値文字列などを数値に変換するという追加の利点があります'123'。
唯一予期しないことは、誰かが正常に数値に変換できる配列を渡す場合です。
+['123'] // 123
ここには、数値文字列である単一のメンバーを持つ配列があります。数値に変換されます。
NaN値のみに関係していると思っていました。これは、すべての非数値のテストとしては機能しません。最初にtoNumber変換を試みることもできますが。更新します。
二重チルド(二重ビット単位のNOT)を使用すると~~、JavaScriptでいくつか興味深いことが行われます。たとえばMath.floor、parseInt("123", 10)!の代わりに、または!これはウェブ上でよく議論されているので、ここで機能する理由については触れませんが、興味がある場合は、JavaScriptの「ダブルチルド」(~~)演算子とは何ですか?
二重チルドのこのプロパティを利用NaNして数値に変換できますが、幸いにもその数値はゼロです!
console.log(~~NaN); // 0
~~使用しただけparseFloat()です~~parseFloat($variable);。非常にきちんと:) +1
独自のメソッドを作成し、数値が必要なすべての場所で使用します。
function getNum(val) {
if (isNaN(val)) {
return 0;
}
return val;
}
null、期待される結果は得られません0。ここで私のポイントの詳細:stackoverflow.com/questions/115548/why-is-isnannull-false-in-js
Number(val)戻ってくるので、代わりに使用する0ことにしました。
続行できるようにそれを固執するのではなく、バックアップして、そもそもなぜNaNに遭遇しているのか疑問に思いませんか?
演算への数値入力のいずれかがNaNの場合、出力もNaNになります。これが、現在のIEEE浮動小数点標準が機能する方法です(Javascriptだけではありません)。その振る舞いには正当な理由がありますます。根本的な意図は、偽の結果に気づかないで偽の結果を使用しないようにすることです。
NaNが機能する方法は、何らかのサブサブ操作で何か問題が発生した場合(その下位レベルでNaNが生成される)、最終結果も NaNになり、これがエラーであってもすぐにエラーとして認識されます。エラー処理ロジック(おそらくスロー/キャッチ?)はまだ完全ではありません。
算術計算の結果としてのNaNは、常に、算術の詳細に問題があることを示しています。これは、コンピュータが「ここでデバッグが必要」と言う方法です。とにかく正しくない数(実際には0が望ましいのか)で続行する方法を見つけるのではなく、問題を見つけて修正してください。
JavaScriptでは、共通の問題は、両方のことであるparseInt(...)とparseFloat(...)(無意味な引数を指定した場合はNaNを返しますnull、''など)。より高いレベルではなく、できるだけ低いレベルで問題を修正してください。そうすれば、全体的な計算の結果が意味をなす可能性が高くなり、計算全体の結果をマジックナンバー(0または1など)に置き換えません。((parseInt(foo.value)|| 0)のトリックは、製品ではなく合計に対してのみ機能します。製品の場合、デフォルト値を0ではなく1にしたいが、指定された値が実際に0である場合は機能しません。)
おそらく、コーディングを簡単にするために、次のように、関数がユーザーから値を取得してクリーンアップし、必要に応じてデフォルト値を提供するようにします。
function getFoobarFromUser(elementid) {
var foobar = parseFloat(document.getElementById(elementid).innerHTML)
if (isNaN(foobar)) foobar = 3.21; // default value
return(foobar.toFixed(2));
}
どの程度正規表現?
function getNum(str) {
return /[-+]?[0-9]*\.?[0-9]+/.test(str)?parseFloat(str):0;
}
以下のコードは、NaNを無視して、正しく入力された数値の計算を可能にします
次のようにparseIntを使用しようとすると、isNaNを使用するメソッドは機能しません。
parseInt("abc"); // NaN
parseInt(""); // NaN
parseInt("14px"); // 14
しかし、2番目のケースでは、isNaNはfalseを生成します(つまり、null文字列は数値です)。
n="abc"; isNaN(n) ? 0 : parseInt(n); // 0
n=""; isNaN(n) ? 0: parseInt(n); // NaN
n="14px"; isNaN(n) ? 0 : parseInt(n); // 14
要約すると、null文字列はisNaNでは有効な数値と見なされますが、parseIntでは有効と見なされません。OSX Mojave上のSafari、Firefox、Chromeで検証済み。
var i = [NaN, 1,2,3];
var j = i.map(i =>{ return isNaN(i) ? 0 : i});
console.log(j)
[0、1、2、3]
ユーザー113716ソリューションを使用しています。これは、すべてのif-elseを回避するのに最適です。テキストボックスユニットとテキストボックス数量から小計テキストボックスを計算するために、この方法を実装しました。
単位と数量のテキストボックスに非数値を書き込むプロセスでは、それらの値はゼロに置き換えられるため、ユーザーデータの最終投稿には非数値がありません。
<script src="/common/tools/jquery-1.10.2.js"></script>
<script src="/common/tools/jquery-ui.js"></script>
<!----------------- link above 2 lines to your jquery files ------>
<script type="text/javascript" >
function calculate_subtotal(){
$('#quantity').val((+$('#quantity').val() || 0));
$('#unit').val((+$('#unit').val() || 0));
var calculated = $('#quantity').val() * $('#unit').val() ;
$('#subtotal').val(calculated);
}
</script>
<input type = "text" onChange ="calculate_subtotal();" id = "quantity"/>
<input type = "text" onChange ="calculate_subtotal();" id = "unit"/>
<input type = "text" id = "subtotal"/>