JavaScriptでNaNを0に変換します


238

ifステートメントなしでNaN値を0に変換する方法はありますか。

if (isNaN(a)) a = 0;

毎回変数をチェックするのはとても面倒です。


4
そのまま関数に入れられませんか?
the_drow

これはほんの20文字のようなものですが、何が問題なのですか?
Rusty Fausak

1
function noNaN( n ) { return isNaN( n ) ? 0 : n; }その後、ちょうどnoNaN( a )
サイムVIDAS

1
@rfausak通常、自分自身を繰り返したくありません(DRYを参照)。特定の機能が複数回必要な場合は、専用の機能をお勧めします。
サイムVIDAS

回答:


575

あなたはこれを行うことができます:

a = a || 0

...を「偽の」値からに変換し0ます。

「false」の値は次のとおりです。

  • false
  • null
  • undefined
  • 0
  • "" (空の文字列)
  • NaN (数字ではない)

またはこれを希望する場合:

a = a ? a : 0;

...上記と同じ効果があります。


目的が以外のものもテストすることである場合NaN、同じことを実行できますが、最初にtoNumber変換を実行します。

a = +a || 0

これは、単項+演算子を使用aして数値に変換しようとします。これには、数値文字列などを数値に変換するという追加の利点があります'123'

唯一予期しないことは、誰かが正常に数値に変換できる配列を渡す場合です。

+['123']  // 123

ここには、数値文字列である単一のメンバーを持つ配列があります。数値に変換されます。


検証を関数に変換するという考えは良いですが、これはよりエレガントです。
タマシュのPap

1
@爆弾:良い点。OPは特定のNaN値のみに関係していると思っていました。これは、すべての非数値のテストとしては機能しません。最初にtoNumber変換を試みることもできますが。更新します。
user113716 2011

...ああ、それは"NaNを0に変換"というタイトルが原因です。とにかく、今は両方の方法をカバーしました。
user113716 2011

2
おかげで、自分のためにこれを少し選択して修正しましたa = a * 1 || 0
誰か

驚くばかり。ありがとう
Apit John Ismail 2018

32

二重チルド(二重ビット単位のNOT)を使用すると~~、JavaScriptでいくつか興味深いことが行われます。たとえばMath.floorparseInt("123", 10)!の代わりに、または!これはウェブ上でよく議論されているので、ここで機能する理由については触れませんが、興味がある場合は、JavaScriptの「ダブルチルド」(~~)演算子とは何ですか?

二重チルドのこのプロパティを利用NaNして数値に変換できますが、幸いにもその数値はゼロです!

console.log(~~NaN); // 0


1
ありがとう、これについてはまったく知りませんでした。次のように~~使用しただけparseFloat()です~~parseFloat($variable);。非常にきちんと:) +1
Rens Tillmann

23

独自のメソッドを作成し、数値が必要なすべての場所で使用します。

function getNum(val) {
   if (isNaN(val)) {
     return 0;
   }
   return val;
}

1
合格した場合null、期待される結果は得られません0。ここで私のポイントの詳細:stackoverflow.com/questions/115548/why-is-isnannull-false-in-js
Andrei Bazanov

2
上記の私のコメントに加えて、どうにか理解できないときにNumber(val)戻ってくるので、代わりに使用する0ことにしました。
Andrei Bazanov 2017年

4

何でも簡単で効果的なもの:

function getNum(val) {
   val = +val || 0
   return val;
}

...を「偽の」値からに変換し0ます。

「false」の値は次のとおりです。

  • false
  • null
  • undefined
  • 0
  • "" (空の文字列)
  • NaN (数字ではない)

1
面白い!valが負の値になる可能性がある場合、それがどのように反応するのか疑問に思っています。私がテストした限り、これには何の問題もありませんが
ルチアーノ

2

続行できるようにそれを固執するのではなく、バックアップして、そもそもなぜ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));
}

2

どの程度正規表現

function getNum(str) {
  return /[-+]?[0-9]*\.?[0-9]+/.test(str)?parseFloat(str):0;
}

以下のコードは、NaNを無視して、正しく入力された数値の計算を可能にします


2

次のように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で検証済み。


1
明らかな解決策の1つは少し面倒です。前ではなくparseIntの後でNaNをチェックします。isNaN(parseInt(n))?parseInt(n):0; // parseIntを2回呼び出す:(
David Crowe

1
そのコメントはあなたの答え(の始まり)であるべきです!
frandroid

より効率的なソリューションでは、null文字列が唯一の異常であると想定しています。n== "" || isNaN(n)?0:parseInt(n); (しかし、他の文字列がある場合はどうなりますか?)
David Crowe

1
var i = [NaN, 1,2,3];

var j = i.map(i =>{ return isNaN(i) ? 0 : i});

console.log(j)

[0、1、2、3]


0

ユーザー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"/>

0

この簡単な機能をお試しください

var NanValue = function (entry) {
    if(entry=="NaN") {
        return 0.00;
    } else {
        return entry;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.