Как превратить NaN из parseInt в 0 для пустой строки? - PullRequest
270 голосов
/ 18 июля 2011

Можно ли как-то вернуть 0 вместо NaN при разборе значений в JavaScript?

В случае пустой строки parseInt возвращает NaN.

Можно ли сделать что-то подобное в JavaScript, чтобы проверить NaN?

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

Или, может быть, есть другая функция или плагин jQuery, который может делать что-то подобное?

Ответы [ 17 ]

688 голосов
/ 18 июля 2011
var s = '';

var num = parseInt(s) || 0;
48 голосов
/ 29 января 2013

Вы также можете использовать функцию isNaN():

var s = ''
var num = isNaN(parseInt(s)) ? 0 : parseInt(s)
21 голосов
/ 23 октября 2013

Я был удивлен, что не увидел упоминаний об использовании Number().Конечно, он будет анализировать десятичные дроби, если он предоставлен, поэтому будет действовать не так, как parseInt(), однако он уже использует основание 10 и превратит «или даже» в 0.

8 голосов
/ 13 ноября 2015

Для людей, не ограниченных 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)

7 голосов
/ 13 ноября 2015

Проблема

В других ответах не учитывается, что 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
2 голосов
/ 20 мая 2015
var value = isNaN(parseInt(tbb)) ? 0 : parseInt(tbb);
2 голосов
/ 02 августа 2018

Делает работу намного чище, чем 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 голос
/ 04 января 2015

У меня была похожая проблема (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 голос
/ 18 июля 2011

Почему бы не переопределить функцию? В этом случае вы всегда можете быть уверены, что он возвращает 0 в случае NaN:

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

Теперь в любом месте вашего кода:

parseInt('') === 0
1 голос
/ 13 ноября 2016
//////////////////////////////////////////////////////
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
...