IsNan()函数将某种字符串视为数字 - 节点js

时间:2013-09-28 09:02:55

标签: javascript node.js casting nan

我正在使用integer函数检查node.js中的IsNaN值。 出乎意料的是,此函数将1E2671461E656716914E6583等字符串验证为数字,因为这些字符串是指数值。有办法解决这个问题吗?在实际情况中,我不会得到任何指数值。

4 个答案:

答案 0 :(得分:3)

ECMA6定义Number.isInteger如下:

的Javascript

function isInteger(nVal) {
    return typeof nVal === "number" && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal;
}

但这也会接受科学记数法

console.log(isInteger(1e6));
console.log(isInteger(+"1e6"));

jsfiddle

您需要明确您的定义/期望是什么。

我的猜测是你可能想要这样的东西,如果你正在测试字符串并且对最大或最小整数没有限制。

的Javascript

function isStringNumericalInteger(testValue) {
    return typeof testValue === "string" && /^[\-+]?[1-9]{1}\d+$|^[\-+]?0$/.test(testValue);
}

console.log(isStringNumericalInteger("9007199254740991"));
console.log(isStringNumericalInteger("-123216848516878975616587987846516879844651654847"));
console.log(isStringNumericalInteger("1.1"));
console.log(isStringNumericalInteger("-1.1"));
console.log(isStringNumericalInteger("1e10"));
console.log(isStringNumericalInteger("010"));
console.log(isStringNumericalInteger("0x9"));
console.log(isStringNumericalInteger(""));
console.log(isStringNumericalInteger(" "));
console.log(isStringNumericalInteger());
console.log(isStringNumericalInteger(null));
console.log(isStringNumericalInteger([]));
console.log(isStringNumericalInteger({}));

输出

true
true
false
false
false
false
false
false
false
false
false
false
false 

jsfiddle

如果你想将范围绑定到javascript可以用数字表示为整数,那么你需要为&& +testValue > -9007199254740992 && +testValue < 9007199254740992添加一个测试

如果您不喜欢使用RegExs,您也可以使用解析器完成此操作。像这样:

的Javascript

function isCharacterDigit(testCharacter) {
    var charCode = testCharacter.charCodeAt(0);

    return charCode >= 48 && testCharacter <= 57;
}

function isStringNumericalInteger(testValue) {
    var start = 0,
        character,
        index,
        length;

    if (typeof testValue !== "string") {
        return false;
    }

    character = testValue.charAt(start);
    if (character === "+" || character === "-") {
        start += 1;
        character = testValue.charAt(start);
    }

    start += 1;
    length = testValue.length;
    if ((length > start && character === "0") || !isCharacterDigit(character)) {
        return false;
    }

    for (index = start; index < length; index += 1) {
        if (!isCharacterDigit(testValue.charAt(index))) {
            return false;
        }
    }

    return true;
}

jsfiddle

答案 1 :(得分:-2)

我会使用类似下面的代码来验证数字输入。首先,我将给定的值解析为float,然后检查isNaN()。

var isNumber = function (obj) {
    return !isNaN(parseFloat(obj)) && isFinite(obj);
};

答案 2 :(得分:-2)

我认为这就是你需要的东西(我讨厌正则表达式,因为这对性能不是很好但是......)

http://jsbin.com/EQiBada/1/

var NMAX = Math.pow(2, 53);
function isNumeric(n) {
  n = n < 0 ? n * -1 : n;
  var r = /^\d+$/.test(n);
  if (r === true)
  {
    return parseInt(n, 10) >= (NMAX * -1) + 1 && parseInt(n, 10) <= NMAX;
  }
  return false;
}

缩小的

var NMAX = Math.pow(2, 53);
function isNumericMin(n) {
  n = n < 0 ? n * -1 : n;
  return /^\d+$/.test(n) === true ? parseInt(n, 10) >= (NMAX * -1) + 1 && parseInt(n, 10) <= NMAX : false;
}

答案 3 :(得分:-2)

var i ='1E267146'   if(isNaN(i)||!isFinite(i)!! i ==“”)     {       // 做东西     }  其他     {      // 做东西     }