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

Jop*_*per 280 javascript nan

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

如果空字符串parseInt返回NaN.

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

var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)
Run Code Online (Sandbox Code Playgroud)

或者可能有另一个函数或jQuery插件可能做类似的事情?

Mat*_*hew 713

var s = '';

var num = parseInt(s) || 0;
Run Code Online (Sandbox Code Playgroud)

  • 当不与布尔值一起使用时,逻辑OR(||)运算符返回第一个表达式(parseInt(s)),如果它可以被计算为true,否则返回第二个表达式(0).parseInt('')的返回值是NaN.NaN的计算结果为false,因此num最终设置为0. (101认同)
  • @markzzz再次阅读问题.OP问道:"_有可能以某种方式返回0而不是NaN_".OP不想检查特定字符串是否可解析为int.OP希望得到"0"而不是"NaN".这完全由马特的代码解决. (22认同)
  • 如果s ="4s",这将不起作用; (它返回4 ...这是不正确的......) (6认同)
  • 为什么它这样工作?你能解释一下吗? (5认同)
  • +1用于在分配中方便地使用逻辑运算符. (3认同)
  • @markzzz`var nextIphone = parseInt(“ 4S”)+1; //哇,行得通! (2认同)
  • @Matthew请使用术语“虚假” **或“真实” **。因为NaN === false是false!但是Boolean(NaN)=== Boolean(false)为true。_如果可以将其计算为**“ truthy” ** _,则逻辑OR返回第一个表达式 (2认同)
  • 哈哈,我两年内第二次尝试投票赞成这个答案 (2认同)

gpr*_*ant 49

你也可以使用这个isNaN()功能:

var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)
Run Code Online (Sandbox Code Playgroud)

  • 为什么要两次调用`parseInt(s)?此外,它应该是`parseInt(s,10)` (11认同)
  • @AutumnLeonard这只是一种真实.如果你的字符串以0开头,则假定数字是八进制格式,因此parseInt('077')给你63.这可能导致非常讨厌查找错误,所以你应该总是指定第二个参数.例如,请参阅http://stackoverflow.com/questions/8763396/javascript-parseint-with-leading-zeros (7认同)
  • @GeorgeJempty默认值为10。该参数是可选的。两次调用`parseInt()`的好处。 (2认同)

小智 20

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


Ahm*_*him 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
Run Code Online (Sandbox Code Playgroud)

注意:ToInt32不同于parseInt.(即parseInt('33Ab') === 33)


sqr*_*ren 7

问题

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

var myNumber = parseInt('0') || 20; // 20
Run Code Online (Sandbox Code Playgroud)

解决方案

我提出了一个辅助函数,可以解决大多数问题:

function getNumber(number, defaultNumber) {
    return isNaN(parseInt(number, 10)) ? defaultNumber : parseInt(number, 10);
}
Run Code Online (Sandbox Code Playgroud)

辅助函数将给出以下结果:

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
Run Code Online (Sandbox Code Playgroud)

  • 请向 parseInt 发送一个基数:`parseInt(string, radix)`,考虑一下:`parseInt("0x10") === 16` 此外,`parseInt("010")` 在某些浏览器中可能会产生 `8` (2认同)
  • 如果你已经依赖 lodash 来处理其他事情,那么有一个方便的 [`defaultTo`](https://lodash.com/docs/4.17.11#defaultTo) 函数可以做到这一点:`_.defaultTo(NaN, -1)` 返回 `-1`,但 `_.defaultTo(0, -1);` 返回 `0`。 (2认同)

Pir*_*App 7

在我看来,这项工作是否比 parseInt 更干净,使用 +operator

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
Run Code Online (Sandbox Code Playgroud)