在JavaScript中解析值时,是否有可能以某种方式返回0而不是NaN
?
如果空字符串parseInt
返回NaN
。
是否可以在JavaScript中执行类似的操作来检查NaN
?
var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)
或许还有另外一个函数或jQuery插件可能会做类似的事情吗?
答案 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
注意:ToInt32
与parseInt
不同。 (即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。此解决方案仅适用于整数