我想用最简单的故障安全测试来检查JavaScript中的字符串是否是正整数。

isNaN(str)为所有非整数值返回true, parseInt(str)为浮点字符串返回整数,如“2.5”。我也不想使用一些jQuery插件。


当前回答

我的标准需要在@VisioN的答案上进行一些额外的检查。

不是负数,包括-0 不是小数部分为零的浮点数——0.0,1.000000 不是指数形式的数字,1e10

我发现这对于验证Express路由器的路由参数很有用。例如/书/:bookId

Code

/**
 * Validate that a string is a positive integer
 * Excludes float numbers with a zero decimal part, exponential notation and negative 0
 * @param n
 * @returns {boolean}
 */
function isStrictlyPositiveInteger(n) {
    const nString = n.toString(), nInt = parseInt(n), nFloat = parseFloat(n);
    // if a negative number (works on -0)
    if (nString.charAt(0) === '-') {
        return false;
    }
    // if an exponential like 1e10
    if (nString.indexOf('e') > -1) {
        return false;
    }
    // if a float number with a zero decimal part e.g 0.0
    if ((nFloat === nInt) && (nString.indexOf('.') > -1)) {
        return false;
    }
    // if a positive integer
    // https://stackoverflow.com/a/10835227/8470877
    return (0 === n % (!isNaN(nFloat) && 0 <= ~~n));
}

测试

"0"                     : true
"23"                    : true
"-10"                   : false
"10.30"                 : false
"-40.1"                 : false
"string"                : false
"1234567890"            : true
"129000098131766699.1"  : false
"-1e10"                 : false
"1e10"                  : false
"1edf"                  : false
" "                     : false
""                      : false
"0.01"                  : false
"0.00"                  : false
"-0"                    : false
"-0.0"                  : false
"0."                    : false
"-"                     : false
".1"                    : false

其他回答

看起来正则表达式是可行的:

var isInt = /^\+?\d+$/.test('the string');

我的标准需要在@VisioN的答案上进行一些额外的检查。

不是负数,包括-0 不是小数部分为零的浮点数——0.0,1.000000 不是指数形式的数字,1e10

我发现这对于验证Express路由器的路由参数很有用。例如/书/:bookId

Code

/**
 * Validate that a string is a positive integer
 * Excludes float numbers with a zero decimal part, exponential notation and negative 0
 * @param n
 * @returns {boolean}
 */
function isStrictlyPositiveInteger(n) {
    const nString = n.toString(), nInt = parseInt(n), nFloat = parseFloat(n);
    // if a negative number (works on -0)
    if (nString.charAt(0) === '-') {
        return false;
    }
    // if an exponential like 1e10
    if (nString.indexOf('e') > -1) {
        return false;
    }
    // if a float number with a zero decimal part e.g 0.0
    if ((nFloat === nInt) && (nString.indexOf('.') > -1)) {
        return false;
    }
    // if a positive integer
    // https://stackoverflow.com/a/10835227/8470877
    return (0 === n % (!isNaN(nFloat) && 0 <= ~~n));
}

测试

"0"                     : true
"23"                    : true
"-10"                   : false
"10.30"                 : false
"-40.1"                 : false
"string"                : false
"1234567890"            : true
"129000098131766699.1"  : false
"-1e10"                 : false
"1e10"                  : false
"1edf"                  : false
" "                     : false
""                      : false
"0.01"                  : false
"0.00"                  : false
"-0"                    : false
"-0.0"                  : false
"0."                    : false
"-"                     : false
".1"                    : false

我的函数检查数字是否为+ve,也可以是十进制值。

       function validateNumeric(numValue){
            var value = parseFloat(numValue);
            if (!numValue.toString().match(/^[-]?\d*\.?\d*$/)) 
                    return false;
            else if (numValue < 0) {
                return false;
            }
            return true;        
        }

这几乎是一个重复的问题:

在JavaScript中验证十进制- IsNumeric()

答案是:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

所以,一个正整数是:

function isPositiveInteger(n) {
  var floatN = parseFloat(n);
  return !isNaN(floatN) && isFinite(n) && floatN > 0
      && floatN % 1 == 0;
}

这就是我如何验证一个字符串是一个正整数。

瓦尔str =“123”; var str1 =“1.5”; var str2 = -123; 控制台(“is str positive integer:”,数字.isInteger(数字(str)和数字(str) > 0) 控制台(“is str1正图:”,数字.isInteger(数字(str1)和数字(str1) > 0) 控制台(“is str2正图:”,isInteger(数字(str2): && Number(str2) > 0)