Javascript 验证字符串是否为正整数

Javascript 验证字符串是否为正整数,javascript,Javascript,我希望使用最简单的故障安全测试来检查JavaScript中的字符串是否为正整数 isNaN(str)为所有类型的非整数值返回true,parseInt(str)为浮点字符串返回整数,如“2.5”。我也不想使用一些jQuery插件。看起来正则表达式是一个不错的选择: var isInt = /^\+?\d+$/.test('the string'); 给你两个答案: 基于句法分析 正则表达式 请注意,在这两种情况下,我将“正整数”解释为包括0,即使0不是正整数。如果您想禁止0,我会添加注释

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


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

看起来正则表达式是一个不错的选择:

var isInt = /^\+?\d+$/.test('the string');
给你两个答案:

  • 基于句法分析

  • 正则表达式

请注意,在这两种情况下,我将“正整数”解释为包括
0
,即使
0
不是正整数。如果您想禁止
0
,我会添加注释

基于句法分析 如果希望它是合理值范围内的标准化十进制整数字符串,可以执行以下操作:

function isNormalInteger(str) {
    var n = Math.floor(Number(str));
    return n !== Infinity && String(n) === str && n >= 0;
}
或者,如果要允许空白和前导零:

function isNormalInteger(str) {
    str = str.trim();
    if (!str) {
        return false;
    }
    str = str.replace(/^0+/, "") || "0";
    var n = Math.floor(Number(str));
    return n !== Infinity && String(n) === str && n >= 0;
}
实时测试台(不处理前导零或空白):

函数isNormalInteger(str){
var n=数学楼层(编号(str));
返回n!==Infinity&&String(n)==str&&n>=0;
}
函数gid(id){
返回文档.getElementById(id);
}
功能测试(str,expect){
var结果=isNormalInteger(str);
console.log(
str+“:”+
(结果?“是”:“否”)+
(expect===未定义?“:!!expect===!!结果?”

如果您给出像“0001”这样的字符串,则将不起作用,但这几乎是与此问题重复的问题:

答案是:

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;
}
解决方案1 如果我们将JavaScript整数设置为最大值
4294967295
(即
Math.pow(2,32)-1
),那么下面的简短解决方案将非常有效:

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

"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
"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
function isPositiveInteger(n) {
    return n == "0" || ((n | 0) > 0 && n % 1 == 0);
}
  • 做三件重要的事情:
    • 截断小数部分
      • 123.45>>0==123
    • 对于负数,该值会发生偏移吗
      • -1>>0==4294967295
    • MAX_INT
      • 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
    
    "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
    
    function isPositiveInteger(n) {
        return n == "0" || ((n | 0) > 0 && n % 1 == 0);
    }
    
    演示:


    解决方案2 另一种方法适用于所有有效值小于或等于
    Number.MAX_VALUE
    ,即小于或等于
    1.7976931348623157e+308

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


    以前的版本:

    "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
    
    "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
    
    function isPositiveInteger(n) {
        return n == "0" || ((n | 0) > 0 && n % 1 == 0);
    }
    

    演示:

    (~~a==a)
    其中
    a
    是字符串。

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

           function validateNumeric(numValue){
                var value = parseFloat(numValue);
                if (!numValue.toString().match(/^[-]?\d*\.?\d*$/)) 
                        return false;
                else if (numValue < 0) {
                    return false;
                }
                return true;        
            }
    
    函数validateEnumeric(numValue){
    var值=parseFloat(numValue);
    如果(!numValue.toString().match(/^[-]?\d*\.?\d*$/)
    返回false;
    else if(数值<0){
    返回false;
    }
    返回true;
    }
    
    仅以VisioN的上述答案为基础,如果您使用的是jQuery验证插件,您可以使用:

    $(document).ready(function() {
        $.validator.addMethod('integer', function(value, element, param) {
            return (value >>> 0 === parseFloat(value) && value > 0);
        }, 'Please enter a non zero integer value!');
    }
    
    然后,您可以在普通规则集中使用或通过以下方式动态添加它:

    $("#positiveIntegerField").rules("add", {required:true, integer:true});
    

    如果您使用的是HTML5表单,则可以对表单元素
    使用属性
    min=“0”
    。这是所有主要浏览器都支持的。对于这样简单的任务,它不涉及Javascript,而是集成在新的html标准中。
    它被记录在

    上。在节点和跨节点(IE和Opera Mini除外)中工作的现代解决方案是使用,然后进行简单的阳性检查

    Number.isInteger(x) && x > 0
    
    这是我的

    Polyfil是:

    Number.isInteger = Number.isInteger || function(value) {
      return typeof value === 'number' && 
        isFinite(value) && 
        Math.floor(value) === value;
    };
    
    如果您需要支持可能是字符串数字形式的输入,那么您可以在所有现有答案(2018年2月1日)在某种形式的输入上失败后进行

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

    您还可以通过prototype扩展数字并为其分配功能。

    ES6:

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

    这就是我验证字符串是否为正整数的方法

    var str=“123”;
    var str1=“1.5”;
    var str2=“-123”;
    log(“是str正整数:”,Number.isInteger(Number(str))&&Number(str)>0)
    log(“是str1正整数:”,Number.isInteger(Number(str1))&&Number(str1)>0)
    
    log(“是str2正整数:”,Number.isInteger(Number(str2))&&Number(str2)>0)
    大多数情况下,您需要对数据库使用情况进行此类检查,例如检查字符串是否有效用户ID。因为不能有任何奇怪的符号可以打包为整数。此外,整数应该在整数的数据库范围内。您只需要正常的整数,如1、2、3等等

    const isStrNormPosInt = (str: string) => {
      return /^([1-9]\d*)$/.test(str) && Number(str) <= 2147483647 // postgres max int
    }
    
    const isStrNormPosInt=(str:string)=>{
    
    return/^([1-9]\d*)$/.test(str)和&Number(str)是否允许“+2”?是否允许“0.1e1”?是否允许“1.0000”?
    isNaN()
    函数的行为方式与它的行为方式相同,因为概念
    不是数字
    在IEEE 794浮点规范中具有非常特定的含义。它不打算回答一个简单的通俗问题,“这个值不是数字吗?”这个问题非常模糊。您无法验证它字符串是一个整数”,因为没有这样的东西——任何对象都不能同时是字符串和数字。您可能是指“如何测试字符串是否是整数的有效表示形式”,但要回答这个问题,我们需要知道您谈论的是哪种语言或“文化”。例如,
    ٢‎٣٤
    MCMXIX
    都是有效的整数表示,但我不认为您正在寻找能够解析这些的代码。您能否指定您将支持哪些数字格式,因为人们似乎对此感到困惑。我认为“vague to extreme”本身有点极端;但无论如何……上下文是验证中使用的购物车上的数量输入字段