如何将NaN从parseInt转换为0表示空字符串?

时间:2011-07-18 16:58:34

标签: javascript nan

在JavaScript中解析值时,是否有可能以某种方式返回0而不是NaN

如果空字符串parseInt返回NaN

是否可以在JavaScript中执行类似的操作来检查NaN

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

或许还有另外一个函数或jQuery插件可能会做类似的事情吗?

18 个答案:

答案 0 :(得分:672)

var s = '';

var num = parseInt(s) || 0;

答案 1 :(得分:47)

您还可以使用isNaN()功能:

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

答案 2 :(得分:21)

我很惊讶没有看到有人提到使用Number()。如果提供的话,它将解析小数,因此将采用与parseInt()不同的行为,但它已经假设为10并且将转为""甚至" "在0。

答案 3 :(得分:8)

对于不限于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

注意:ToInt32parseInt不同。 (即parseInt('33Ab') === 33

答案 4 :(得分:7)

问题

其他答案没有考虑到0是假的,因此以下将是20而不是0:

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

答案 5 :(得分:2)

var value = isNaN(parseInt(tbb)) ? 0 : parseInt(tbb);

答案 6 :(得分:1)

为什么不覆盖这个功能?在这种情况下,如果0

,您始终可以确保它返回NaN
(function(original) {
    parseInt = function() {
        return original.apply(window, arguments) || 0;
    };
})(parseInt);

现在,代码中的任何位置:

parseInt('') === 0

答案 7 :(得分:1)

我遇到类似的问题(firefox v34),其中包含简单的字符串:

var myInt = parseInt("b4");

所以我想出了一个快速的黑客:

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

然后让所有愚蠢的事情变得复杂,以处理不简单的浮点数+整数:

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

答案 8 :(得分:1)

单独检查空字符串(因为它是一个特定情况)并在这种情况下将其设置为零。

您可以在开头显示“0”,但是您需要添加前缀以指示它是小数而不是八进制数

答案 9 :(得分: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

答案 10 :(得分:1)

我认为这项工作比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

答案 11 :(得分:1)

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

说明,对于那些认为微不足道的人:

乘以一个称为“隐式强制转换”的方法,尝试将未知类型的操作数转换为原始类型“数字”。特别是,空字符串将变为数字0,使其成为parseInt()的合格类型。

PirateApp在上面也给出了一个很好的例子,他建议在前面加上+号,从而迫使JavaScript使用Number隐式强制转换。

答案 12 :(得分: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); 

这样做有什么不对?

答案 13 :(得分:0)

这是我正在使用的tryParseInt方法,它将默认值作为第二个参数,因此它可以是您需要的任何内容。

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

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

答案 14 :(得分:0)

我创建了一个2原型来为我处理这个,一个用于数字,一个用于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

答案 15 :(得分:0)

仍然可以使用基数的辅助功能

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

答案 16 :(得分:0)

您可以拥有非常干净的代码,我遇到了类似的问题,并且可以通过使用以下命令解决它:

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

答案 17 :(得分:0)

对于正在寻找此解决方案的其他人,只需使用: ~~ 而无需parseInt,这是最干净的模式。

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

如果为NaN,它将返回0。

OBS。此解决方案仅适用于整数