如何将NaN从parseInt转换为空字符串的0
How to turn NaN from parseInt into 0 for an empty string?
是否有可能在JavaScript中解析值时返回0而不是NaN
?
如果是空字符串parseInt
,则返回NaN
。
是否可以在JavaScript中做这样的事情来检查NaN
?
var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)
或者可能有另一个函数或jQuery插件可以做类似的事情?
var s = '';
var num = parseInt(s) || 0;
不与布尔值一起使用时,如果第一个表达式可以求值为true
,则逻辑或||
运算符返回parseInt(s)
,否则返回第二个表达式0
。parseInt('')
返回值为NaN
。NaN
求值为false
,因此num
最终被设置为0
。
您也可以使用isNaN()
函数:
var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)
问题
其他答案没有考虑到0
是假的,因此以下将是20而不是0:
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
我很惊讶没有人提到使用Number()
。如果提供的话,它将解析小数,因此它的行为与parseInt()
不同,但是它已经假设基数为10,并且会将"或甚至"转换为0。
对于不限于parseInt
的人,可以使用按位或运算符(它隐式地将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
)
在我看来,使用+操作符
比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
为什么不重写这个函数呢?在这种情况下,你总是可以确保它在NaN
的情况下返回0
:
(function(original) {
parseInt = function() {
return original.apply(window, arguments) || 0;
};
})(parseInt);
现在,在代码的任何地方:
parseInt('') === 0
var value = isNaN(parseInt(tbb)) ? 0 : parseInt(tbb);
//////////////////////////////////////////////////////
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
对于其他寻找此解决方案的人,只需使用:~~不带parseInt,这是最干净的模式。
var a = 'hello';
var b = ~~a;
如果是NaN,它将返回0。
奥林匹克广播服务公司。此解决方案仅适用于整数
对空字符串(因为它是一种特殊情况)进行单独检查,并在这种情况下将其设置为零。
可以在开头加上"0",但是需要添加一个前缀来表示它是十进制而不是八进制
我有一个类似的问题(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
我创建了2个原型来处理这个问题,一个用于数字,一个用于字符串。
// 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
你可以有非常干净的代码,我有类似的问题,我解决它通过使用:
var a="bcd";
~~parseInt(a);
// implicit cast
var value = parseInt(tbb*1); // see original question
解释,对于那些不觉得它微不足道的人:
乘以1,称为"隐式强制类型转换"的方法试图将未知类型的操作数转换为基本类型"number"。特别是,空字符串将变成数字0,使其成为parseInt()的合格类型…
PirateApp上面也给出了一个很好的例子,他建议在+号前加上+号,强制JavaScript使用Number隐式强制转换。
8月。20更新:parseInt("0"+expr);
给出了更好的结果,特别是parseInt("0"+'str');
也是这样,为什么不编写一个函数并在需要的地方调用它呢?我假设它是进入表单字段执行计算的入口。
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);
这样做有什么不对?
这是一个我正在使用的tryParseInt方法,它将默认值作为第二个参数,因此它可以是您需要的任何东西。
function tryParseInt(str, defaultValue) {
return parseInt(str) == str ? parseInt(str) : defaultValue;
}
tryParseInt("", 0);//0
tryParseInt("string", 0);//0
tryParseInt("558", 0);//558
仍然允许使用基数
的辅助函数function parseIntWithFallback(s, fallback, radix) {
var parsed = parseInt(s, radix);
return isNaN(parsed) ? fallback : parsed;
}
- 如何在JavaScript中将字符串转换为函数引用
- 如何在 Javascript 中将变量的值从字符串转换为整数
- 将字符串转换为格式化日期
- IE在将字符串转换为日期时从日期中删除4小时
- node.js将字符串转换为要上传到Web服务器的文件
- 将字符串转换为JS对象
- 在js中将字符串转换为十六进制
- 试图了解如何使用parseFloat将字符串转换为数字
- 如何在html中将字符串转换为数字?以及如何将变量传递到scriptlet代码中
- 将字符串转换为GWT中的JSON对象(JSNI)
- 如何使用Razor显示模板将字符串转换为html字符串
- 将字符串转换为数组编号Javascript
- js字符串转换为具有两个值的对象
- 转换<a>使用jQuery将文本字符串转换为dom元素
- Jquery-将字符串转换为reg exp对象
- 使用JavaScript将客户端日期/时间字符串转换为JSON日期/时间串
- 将JavaScript字符串转换为整数
- moment js,将EST字符串转换为UTC
- 如何在javascript中将字符串转换为有效日期
- 通过JQuery将字符串转换为JSON