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

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


当前回答

ES6:

Number.isInteger(Number(theNumberString)) && Number(theNumberString) > 0

其他回答

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

在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;
}
return ((parseInt(str, 10).toString() == str) && str.indexOf('-') === -1);

但是,如果您提供'0001'这样的字符串,则无法工作

适用于node和90%以上浏览器(IE和Opera Mini除外)的现代解决方案是使用Number。isInteger后跟一个简单的正检查。

Number.isInteger(x) && x > 0

这是在ECMAScript 2015中完成的。

function isPositiveInteger(x) {
    return Number.isInteger(x) && x > 0
}

Polyfil是:

Number.isInteger = Number.isInteger || function(value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};

如果你需要支持字符串或数字形式的输入,那么你可以使用这个函数,在所有现有的答案(2/1/2018)在某种形式的输入上失败后,我写了一个大型测试套件。

function isPositiveInteger(v) {
  var i;
  return v && (i = parseInt(v)) && i > 0 && (i === v || ''+i === v);
}

解决方案1

如果我们将JavaScript整数视为最大值4294967295(即Math.pow(2,32)-1),那么以下简短的解决方案将完美地工作:

function isPositiveInteger(n) {
    return n >>> 0 === parseFloat(n);
}

描述:

零填充右移操作符有三件重要的事情: 截断小数部分 123.45 >>> 0 === 123 对负数有移位吗 -1 >>> 0 === 4294967295 MAX_INT范围内的"works" 1e10 >>> 0 === 1410065408 1e7 >>> 0 === 10000000 parseFloat正确解析字符串数字(为非数字字符串设置NaN)

测试:

"0"                     : true
"23"                    : true
"-10"                   : false
"10.30"                 : false
"-40.1"                 : false
"string"                : false
"1234567890"            : true
"129000098131766699.1"  : false
"-1e7"                  : false
"1e7"                   : true
"1e10"                  : false
"1edf"                  : false
" "                     : false
""                      : false

演示:http://jsfiddle.net/5UCy4/37/


解决方案2

另一种方法适用于在Number之前有效的所有数值。MAX_VALUE,即约1.7976931348623157e+308:

function isPositiveInteger(n) {
    return 0 === n % (!isNaN(parseFloat(n)) && 0 <= ~~n);
}

描述:

isNaN(parseFloat(n))用于过滤纯字符串值,例如:"", "", "string"; 0 <= ~~n过滤负的和大的非整数值,例如:“-40.1”,“129000098131766699”; (!isNaN(parseFloat(n)) && 0 <= ~~n)如果value为数值且为正数则返回true; 0 === n %(…)检查value是否为非浮点值——这里(…)(见3)在false的情况下被计算为0,在true的情况下被计算为1。

测试:

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

演示:http://jsfiddle.net/5UCy4/14/


以前的版本:

function isPositiveInteger(n) {
    return n == "0" || ((n | 0) > 0 && n % 1 == 0);
}

演示:http://jsfiddle.net/5UCy4/2/

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

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