空の文字列でNaNをparseIntから0に変換する方法は?


298

NaNJavaScriptで値を解析するときに、何とかして0を返すことは可能ですか?

空の文字列の場合はをparseInt返しますNaN

チェックするためにJavaScriptでそのようなことをすることは可能NaNですか?

var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)

または、同様のことを行う別の関数またはjQueryプラグインがあるでしょうか?


72
FYI、 NaN != NaN。あなたが必要になるでしょうisNaN(value)
pimvdb 2011

28
はい、2人の乳母は同じです;)
James P.

3
関数をparseInt()2回呼び出す(成功/通常以外のNaN場合)ことは決して良い考えではありません。非効率性は別として、渡されたものがtbb副作用のある関数呼び出しである場合、不注意な場合はひどいです。ここで私がparseInt()2度目にするソリューションは使用しません。
JonBrave 2016年

回答:


756
var s = '';

var num = parseInt(s) || 0;

ブール値で使用しない場合、論理OR(||)演算子は、parseInt(s)trueと評価できる場合は最初の式()を返し、それ以外の場合は2番目の式(0)を返します。の戻り値parseInt('')はNaNです。NaNはfalseと評価されるため、最終的numに0に設定されます。


6
s = "4s"の場合、これは機能しません。(4を返します...これは正しくありません...)
markzzz

1
jsのparseInt関数は、文字列の任意の数値を解析します
ali youhannaei 2013

26
@markzzzもう一度質問を読んでください。OPは「NaNの代わりに0を返すことはどういうわけか可能ですか尋ねます。OPは、特定の文字列がintに解析可能かどうかをチェックしません。OPはの0代わりに取得したいNaN。これはマットのコードによって完全に解決されます。
trejder 2013

2
@markzzzvar nextIphone = parseInt("4S") + 1; // wow it works!
気晴らしゼロ

2
@マシューは「偽」という用語を使用するか、 "truthy"。NaN === falseはfalseだからです!しかしBoolean(NaN)=== Boolean(false)はtrueです。論理ORは、「真の」
Pablo

52

isNaN()関数を使用することもできます:

var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)

12
なぜparseInt(s)二度電話するの?さらにそれはする必要がありますparseInt(s, 10)
16:32にDexygen

2
@GeorgeJemptyデフォルトの基数は「10」です。このパラメーターはオプションです。parseInt()ただし、2回呼び出すことの利点。
Autumn Leonard

8
@AutumnLeonardこれは一種の真実です。文字列が0で始まる場合、数値は8進数形式であると想定されるため、parseInt( '077')は63を提供します。これにより、バグを見つけるのが非常に厄介になる可能性があるため、常に2番目のパラメーターを指定する必要があります。たとえば、stackoverflow.com
questions / 8763396 /…を

22

を使用して言及してNumber()いる人がいないことに驚きました。与えられている場合は小数を解析するため、とは異なる動作をしますがparseInt()、すでに10を基数としており、 ""または ""も0に変換します。


1
はい、localStorageからの読み取りに非常に便利です:Number(localStorage.getItem( 'appBanner.count'))+ 1
Philip Murphy

質問どおりに機能しますが、数字以外の非空白文字に対してはNaNを返します
カイルデラニー

9

に制限されていない人はparseInt、ビット単位のOR演算子(暗黙的ToInt32にそのオペランドを呼び出す)を使用できます。

var value = s | 0;

// NaN | 0     ==>> 0
// ''  | 0     ==>> 0
// '5' | 0     ==>> 5
// '33Ab' | 0  ==>> 0
// '0x23' | 0  ==>> 35
// 113 | 0     ==>> 113
// -12 | 0     ==>> -12
// 3.9 | 0     ==>> 3

注:はとToInt32は異なりparseIntます。(つまりparseInt('33Ab') === 33


しかし:'10000000000' | 0 === 1410065408
トリンコット

@trincotはい、> =の値Math.pow(2, 31)はオーバーフローします。
Ahmad Ibrahim

8

問題

他の答えはそれ0が偽物であることを考慮に入れていないため、以下は0ではなく20になります。

const myNumber = parseInt('0') || 20; // 20

ソリューション

ほとんどの問題を解決するヘルパー関数を提案します。

function getNumber({ value, defaultValue }) {
  const num = parseInt(value, 10);
  return isNaN(num) ? defaultValue : num;
}

ヘルパー関数は次の結果を返します。

getNumber({ value: "0", defaultValue: 20 }); // 0
getNumber({ value: "2", defaultValue: 20 }); // 2
getNumber({ value: "2.2", defaultValue: 20 }); // 2
getNumber({ value: "any string", defaultValue: 20 }); // 20
getNumber({ value: undefined, defaultValue: 20 }); // 20
getNumber({ value: null, defaultValue: 20 }); // 20
getNumber({ value: NaN, defaultValue: 20 }); // 20
getNumber({ value: false, defaultValue: 20 }); // 20
getNumber({ value: true, defaultValue: 20 }); // 20

2
parseIntの基数を送ってください:parseInt(string, radix):、このことを考慮するparseInt("0x10") === 16parseInt("010")生じる可能性があり8、一部のブラウザで
andlrc

2
あなたが既に他のもののためにlodashに依存しているなら、defaultToこれだけを行う便利な関数があります:を_.defaultTo(NaN, -1)返します-1が、_.defaultTo(0, -1);返します0
危険な

これは素晴らしい点です!信頼できるのは||だけです 優先するデフォルトがゼロの場合に正しいデフォルトを提供するために最後に(許可された、これはOPが望むものです)。すでに述べたように、「0」入力の偽の性質のため、この場合は無効な入力として扱われ、ステートメントは代わりにデフォルト値を返します(多分期待されたものではないかもしれません!)
JonathanDavidArndt

確かに、parseInt2回呼び出す代わりにconstを使用する必要があります
カイルデラニー

4

私の意見では、仕事はparseIntよりもはるかにきれいですか、+演算子を使用します

var s = '';
console.log(+s);

var s = '1024'
+s
1024

s = 0
+s
0

s = -1
+s
-1

s = 2.456
+s
2.456

s = ''
+s
0

s = 'wtf'
+s
NaN

1
とてもコンパクト。これ以上ポイントを獲得できなかったのは残念です。投票しました。ミュートトロールによって今日獲得された私の-2を捕まえるために往復してください...(このページの最後にある私の答えを参照してください)。ありがとうございました。
Fabien Haddadi、2018


1

空の文字列を個別にチェックし(特定のケースの1つであるため)、この場合はゼロに設定します。

最初に「0」を付けることもできますが、その後、プレフィックスを追加して、それが10進数であって8進数ではないことを示す必要があります


空の場合は0を追加する方が良いと思いますか?
ジョーパー、2011

1
いいえ-それは私が使用したアプローチです。この場合は、個別のチェックをお勧めします。ただし、Mattsソリューションが機能する場合は、さらにクリーンになります。
Schroedingers Cat

1

関数をオーバーライドしないのはなぜですか?その場合、あなたは常にそれを返すことを確認することができ0た場合にはNaN

(function(original) {
    parseInt = function() {
        return original.apply(window, arguments) || 0;
    };
})(parseInt);

今、あなたのコードのどこにでも:

parseInt('') === 0

15
このような関数をオーバーライドすると、それをバグと見なす可能性のある熟練したJavaScriptプログラマーを混乱させる可能性があります。オーバーライドされた関数は、見られそうにない場所に埋め込まれている可能性があります。これは独創的ですが|| 0、マットの答えのようにを追加するのがどれほど簡単であるかを考えると、個人的にお勧めするかどうかはわかりません。最後の手段として所有していないオブジェクトをオーバーライドすると、そうしないと、時間と複雑さの点で大幅にコストが高くなります。
jmort253 2012年

2
@ jmort253に同意します...関数がスマートすぎて危険です。まったく同じ機能を実行することをお勧めしますが、getSafeNumberValueなどの名前を使用します。
Samuel

1

私は次のような単純な文字列で同様の問題(firefox v34)を抱えていました:

var myInt = parseInt("b4");

だから私は簡単なハックを思いつきました:

var intVal = ("" + val).replace(/[^0-9]/gi, "");

そして、単純ではないもののfloat + intを処理するためにすべての愚かな複雑さを得ました:

var myval = "12.34";

function slowParseNumber(val, asInt){
    var ret = Number( ("" + val).replace(/[^0-9\.]/gi, "") );
    return asInt ? Math.floor(ret) : ret;
}
var floatVal = slowParseNumber(myval);

var intVal = slowParseNumber(myval, true);
console.log(floatVal, intVal);

次のような場合は0を返します。

var intVal = slowParseNumber("b"); // yeilds 0

1
//////////////////////////////////////////////////////
function ToInt(x){x=parseInt(x);return isNaN(x)?0:x;}
//////////////////////////////////////////////////////
var x = ToInt('');   //->  x=0
    x = ToInt('abc') //->  x=0
    x = ToInt('0.1') //->  x=0
    x = ToInt('5.9') //->  x=5
    x = ToInt(5.9)   //->  x=5
    x = ToInt(5)     //->  x=5

この解決策を説明できますか?
RamenChef 2016年

uが任意の数値( '123'や123など)を整数に変換する場合、parseInt( 'abc')を使用する場合
AbdulRahman AlShamiri

parseInt( 'abc')を使用する場合、uはNaNに到達しますが、この関数はNaNを0に変換します
AbdulRahman AlShamiri

ビンゴ、||アプローチの明示的な代替として。私はこれが古い質問と回答であることを知っていますが、この回答はparseIntを2回呼び出すことを避け、isNaNを正しく使用します。基数parseInt(x, 10)を徹底する必要があるだけです。(私の好みは、再利用するのではなく、別の内部変数ですx。)
goodeye

1

これを処理する2つのプロトタイプを作成しました。1つは数値用、もう1つは文字列用です。

// This is a safety check to make sure the prototype is not already defined.
Function.prototype.method = function (name, func) {
    if (!this.prototype[name]) {
        this.prototype[name] = func;
        return this;
    }
};

// returns the int value or -1 by default if it fails
Number.method('tryParseInt', function (defaultValue) {
    return parseInt(this) == this ? parseInt(this) : (defaultValue === undefined ? -1 : defaultValue);
});

// returns the int value or -1 by default if it fails
String.method('tryParseInt', function (defaultValue) {
    return parseInt(this) == this ? parseInt(this) : (defaultValue === undefined ? -1 : defaultValue);
});

安全チェックを使いたくない場合は、

String.prototype.tryParseInt = function(){
    /*Method body here*/
};
Number.prototype.tryParseInt = function(){
     /*Method body here*/
};

使用例:

var test = 1;
console.log(test.tryParseInt()); // returns 1

var test2 = '1';
console.log(test2.tryParseInt()); // returns 1

var test3 = '1a';
console.log(test3.tryParseInt()); // returns -1 as that is the default

var test4 = '1a';
console.log(test4.tryParseInt(0));// returns 0, the specified default value

1
// implicit cast
var value = parseInt(tbb*1); // see original question

説明、些細なことに気づかない人のために:

「暗黙のキャスト」と呼ばれる方法である1を乗算すると、不明な型のオペランドがプリミティブ型の「数値」に変換されます。特に、空の文字列は数値0になり、parseInt()に適した型になります...

+記号を前に付けることを提案し、JavaScriptにNumber暗黙的キャストを使用することを強制するPirateAppによって、非常に優れた例も上記で提供されました。


これは、私の親愛なる元の質問に対する直接の回答です。
Fabien Haddadi、2018

これは効果がありませんparseInt('str'*1)
Rodion Baskakov

なぜparseIntすでに数字であるものを呼び出すのですか?これにより、再び数値に変換するためだけに、文字列に戻る別の変換が発生します。
トリンコット

0

また、このように、関数を作成して、必要な場所で呼び出してみませんか。これは、計算を実行するためのフォームフィールドへのエントリであると想定しています。

var Nanprocessor = function (entry) {
    if(entry=="NaN") {
        return 0;
    } else {
        return entry;
    }
}

 outputfield.value = Nanprocessor(x); 

// where x is a value that is collected from a from field
// i.e say x =parseInt(formfield1.value); 

これを行うと何が問題になっていますか?


こんにちは、ワットは私たちに上記の方法に従うことを止めています。nを学びたいと思います。
Naresh、2013年

3
isNaNを使用してをテストする必要がありますNaN
マシュー

2
ありがとうMatt :) javascripにisNaN()という関数があることを知りません!知らせてくれてありがとうございます...!
Naresh 2013年

0

以下は、私が使用しているtryParseIntメソッドです。これは、2番目のパラメーターとしてデフォルト値を使用するため、必要なものにできます。

function tryParseInt(str, defaultValue) {
    return parseInt(str) == str ? parseInt(str) : defaultValue;
}

tryParseInt("", 0);//0 
tryParseInt("string", 0);//0 
tryParseInt("558", 0);//558

0

基数を使用できるようにするヘルパー関数

function parseIntWithFallback(s, fallback, radix) {
    var parsed = parseInt(s, radix);
    return isNaN(parsed) ? fallback : parsed;
}

0

あなたは非常にクリーンなコードを持つことができます、私は同様の問題があり、私はそれを使ってそれを解決しました:

var a="bcd";
~~parseInt(a);

0

このソリューションを探している他の人は、次を使用してください:~~ parseIntなしで、最もクリーンなモードです。

var a = 'hello';
var b = ~~a;

NaNの場合は、代わりに0を返します。

OBS。このソリューションは整数にのみ適用されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.