web-dev-qa-db-ja.com

空の文字列に対してNaNをparseIntから0に変換する方法

JavaScriptで値を解析するとき、どういうわけかNaNの代わりに0を返すことは可能ですか?

空の文字列の場合、parseIntNaNを返します。

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

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

それとも、似たようなことをする可能性のある他の関数やjQueryプラグインがあるのでしょうか。

263
Joper
var s = '';

var num = parseInt(s) || 0;

isNaN()関数を使うこともできます。

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

誰もがNumber()の使用について言及していないのを見て私は驚きました。与えられていれば小数点以下を解析しますので、parseInt()とは異なる動作をしますが、すでに10を基数とし、 ""または ""を0に変換します。

21
Chris Werner

parseIntに制限されていない人のために、(暗黙のうちに ToInt32 をそのオペランドに呼び出す)OR演算子を使うことができます。

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

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

8
Ahmad Ibrahim

問題

0が偽造されていることを考慮に入れていない他の回答は、したがって、以下は0ではなく20になります。

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

解決策

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

function getNumber(number, defaultNumber) {
    return isNaN(parseInt(number, 10)) ? defaultNumber : parseInt(number, 10);
}

ヘルパー関数は以下の結果をもたらします。

getNumber('0', 20); // 0
getNumber('2', 20); // 2
getNumber('2.2', 20); // 2
getNumber('any string', 20); // 20
getNumber(undefined, 20); // 20
getNumber(null, 20); // 20
getNumber(NaN, 20); // 20
getNumber(false, 20); // 20
getNumber(true, 20); // 20
7
sqren
var value = isNaN(parseInt(tbb)) ? 0 : parseInt(tbb);
2
Milap Jethwa

私の意見では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
PirateApp

以下のような単純な文字列でも同様の問題がありました(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
bob

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

先頭に "0"を追加することもできますが、それが10進数であり8進数ではないことを示すために接頭辞を追加する必要があります。

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
// implicit cast
var value = parseInt(tbb*1); // see original question

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

1を掛けて、「暗黙のキャスト」と呼ばれる方法は、未知の型オペランドをプリミティブ型 'number'に変換しようとします。特に、空の文字列は数値0になり、parseInt()の適格な型になります。

非常に良い例が上にPirateAppによっても与えられました、そして、彼はJavaScriptに強制的にNumber暗黙のキャストを使わせることを勧めました。

1
Fabien Haddadi

なぜ関数をオーバーライドしないのですか?その場合、NaNの場合は必ず0が返されることを確認できます。

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

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

parseInt('') === 0
1
pimvdb

また、このように、なぜ関数を書いて、かつてないところでそれを呼び出してはいけません。計算を実行するのはフォームフィールドへの入力だと思います。

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

これはどうしたの?

0
Naresh

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

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

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

var a="bcd";
~~parseInt(a);
0
Bishal Gautam

これが私が使用している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
Darrelk

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

// 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
0
Mike