如何将NaN从parseInt转换为0以获取空字符串?


298

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

如果为空字符串,则parseInt返回NaN

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

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

或者,也许还有另一个功能或jQuery插件可以做类似的事情?


72
仅供参考NaN != NaN。您需要isNaN(value)
pimvdb

28
是的,没有两个保姆是相同的;)
詹姆斯·P。12年

3
parseInt()两次调用函数(在成功/正常NaN情况下)永远不是一个好主意。除了效率低下外,对于那些无所事事的人来说,如果传递的任何东西都是tbb带有副作用的函数调用,那将是可怕的。我不会在这里看到parseInt()两次的情况下使用任何解决方案。
JonBrave '16

Answers:


756
var s = '';

var num = parseInt(s) || 0;

如果不与布尔值一起使用,则逻辑OR(||)运算符parseInt(s)可以被评估为true,则返回第一个表达式(),否则返回第二个表达式(0)。的返回值为parseInt('')NaN。NaN的计算结果为false,因此num最终被设置为0。


6
如果s =“ 4s”,则无法使用;(返回4 ...这是不正确的...)
markzzz 2012年

1
js中的parseInt函数解析字符串中的任何数字
ali youhannaei

26
@markzzz再次阅读问题。OP询问:“ 是否可能以某种方式返回0而不是NaN ”。OP不想检查特定的字符串是否可解析为int。OP希望获得0而不是NaN。这是由Matt的代码完美解决的。
trejder

2
@markzzzvar nextIphone = parseInt("4S") + 1; // wow it works!
零干扰

2
@Matthew请使用术语“ falsy”“ truthy”。因为NaN === false是false!但是Boolean(NaN)=== Boolean(false)为true。如果可以将其计算为“真实”,
Pablo Recalde,

51

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

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

12
为什么要打parseInt(s)两次电话?而且应该是parseInt(s, 10)
Dexygen

2
@GeorgeJempty默认值为10。该参数是可选的。好点,parseInt()但两次打电话。
秋季伦纳德

8
@AutumnLeonard这只是一种真实。如果您的字符串以0开头,则假定数字为八进制格式,因此parseInt('077')会给您63。这可能会导致查找错误,因此您应始终指定第二个参数。例如参见stackoverflow.com/questions/8763396/...
chuck258

22

我很惊讶没有看到有人提及使用Number()。授予它可以解析小数(如果提供的话),因此parseInt()它的行为将不同于,但是它已经假设以10为底,并且会将“”甚至“”变为0。


1
是的,非常便于从localStorage读取:Number(localStorage.getItem('appBanner.count'))+ 1
Philip Murphy

尽管该方法可以解决所要求的问题,但仍会为非数字非空格字符返回NaN
Kyle Delaney

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

@trincot是的,任何> =值Math.pow(2, 31)都会溢出。
艾哈迈德·易卜拉欣

8

问题

其他答案没有考虑到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

2
请发送一个基数到parseInt parseInt(string, radix)parseInt("0x10") === 16parseInt("010")8
:,

2
如果您已经根据lodash对于其他的东西,有一个方便的defaultTo,不只是这个函数:_.defaultTo(NaN, -1)返回-1,但_.defaultTo(0, -1);回报率0
waldyrious

这是一个很好的观点!您只能依靠|| 最后,当您的首选默认值为零时,可以提供正确的默认值(允许,这是OP想要的)。如您所述,由于输入'0'的虚假性质,在这种情况下,它将被视为无效输入,并且该语句将返回默认值(也许不是预期的值!)
JonathanDavidArndt,

当然,您应该使用const而不是调用parseInt两次
Kyle Delaney

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 ...(请参阅此页面末尾的答案)。谢谢。
法比恩·哈达迪


1

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

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


所以您认为最好将0附加为空?
Joper

1
不,这是我使用的一种方法。在这种情况下,单独检查会更好。但是,如果Matts解决方案有效,那就更干净了。
Schroedingers猫,

1

为什么不覆盖该功能?在这种情况下,您始终可以确保0在以下情况下返回NaN

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

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

parseInt('') === 0

15
像这样覆盖函数可能会使专业的JavaScript程序员感到困惑,他们可能会将其视为错误。您的重写功能很可能埋在看不见的地方。这是有创意的,但是考虑到|| 0在Matt的答案中添加一个as 是多么容易,所以我不确定我个人会推荐它。我看到作为最后的手段您不拥有覆盖的对象,或者如果不这样做,则在时间和复杂性方面的开销会大大增加。
jmort253

2
我同意@ jmort253 ...这很危险,因为该功能过于智能。最好执行完全相同的功能,但要使用类似getSafeNumberValue之类的名称。
塞缪尔(Samuel)

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

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

如果您想将任何数字(例如'123'或123)转换为整数,如果您将使用parseInt('abc'),
AbdulRahman AlShamiri

如果您将使用parseInt('abc'),则会进入NaN,但是此函数会将NaN转换为0
AbdulRahman AlShamiri

宾果游戏是该||方法的明确替代方法。我知道这是一个古老的问题和答案,但是此答案避免了两次调用parseInt并正确使用isNaN。它只需要基数parseInt(x, 10)要彻底。(我的喜好是使用单独的内部变量,而不是重复使用x。)
goodeye,2016年

1

我创建了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

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

解释,对于那些认为微不足道的人:

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

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


这是对亲爱的原始问题的直接答案。
法比恩·哈达迪

这不会parseInt('str'*1)
起作用

为什么要呼叫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

3
您应该使用isNaN进行测试NaN
马修(

2
谢谢马特:)我不知道javascrip中有一个叫做isNaN()的函数!谢谢你让我知道...!
Naresh

0

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

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

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

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

如果为NaN,它将返回0。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.