0

我正在检查使用函数的integer值。出乎意料的是,此函数将, ,之类的字符串验证为数字,因为这些字符串是指数值。有什么办法可以解决这个问题?在实际情况下,我不会得到任何指数值。node.jsIsNaN1E2671461E656716914E6583

4

4 回答 4

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

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

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

于 2013-09-28T10:59:07.083 回答
-2

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

var isNumber = function (obj) {
    return !isNaN(parseFloat(obj)) && isFinite(obj);
};
于 2013-09-28T09:21:15.837 回答
-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;
}
于 2013-09-28T10:07:07.517 回答
-2

var i = '1E267146' if(isNaN(i) || !isFinite(i) !! i=="") { // 做事 } else { // 做事 }

于 2013-09-28T11:44:37.143 回答