JavaScript-测试整数


77

我有一个文本字段,允许用户输入他们的年龄。我正在尝试使用JavaScript在此字段上进行一些客户端验证。我已经在服务器端进行了验证。但是,我似乎无法验证用户输入的是实际整数。我目前正在尝试以下代码:

    function IsValidAge(value) {
        if (value.length == 0) {
            return false;
        }

        var intValue = parseInt(value);
        if (intValue == Number.NaN) {
            return false;
        }

        if (intValue <= 0)
        {
            return false;
        }
        return true;
    }

奇怪的是,我已经在文本框中输入了“ b”之类的单个字符,并且此方法返回true。如何确保用户仅输入整数?

谢谢


4
只是相关的注释,您应该始终使用两个参数调用parseInt():值和基数(基数)。否则parseInt()将尝试猜测您输入的基础。
蜡翼

1
如果用户输入“ 1.1”,是否要使验证失败或被强制为“ 1”?
Nosredna,2009年

1
因此,“ 1.0”是否为整数?
Nosredna,2009年

MDN提及:使用Number.isNaN()isNaN()最清楚地确定一个值是否为NaN
TorstenRömer2015年

Answers:


8

更新

我已经修复了有错误的代码,并添加了一个称为key的变量来存储使用keyCode其中依赖于浏览器的按键代码。

var key = e.which || e.keyCode;

谢谢Donald.McLean :)


如果要在键入时检查是否在写数字(并避免在输入字段中写其他字符),则可以使用此简单函数,并且可以定义允许的元素(包括要过滤的任何元素)。这样,您不仅可以选择整数,还可以选择某些字符组。该示例基于jQuery,将其附加到输入字段。

$('#myInputField').keypress(function(e)
{
    var key = e.which || e.keyCode;

    if (!(key >= 48 && key <= 57) && // Interval of values (0-9)
         (key !== 8) &&              // Backspace
         (key !== 9) &&              // Horizontal tab
         (key !== 37) &&             // Percentage
         (key !== 39) &&             // Single quotes (')
         (key !== 46))               // Dot
    {
        e.preventDefault();
        return false;
    }
});

如果您使用的不是定义的键,则该键不会出现在该字段中。而且由于Angular.js如今变得越来越强大。您可以创建此指令来在Web应用程序的任何字段中执行此操作:

myApp.directive('integer', function()
{
    return function (scope, element, attrs)
    {
        element.bind('keydown', function(e)
        {
            var key = e.which || e.keyCode;

            if (!(key >= 48 && key <= 57) && // Interval (0-9)
                 (key !== 8) &&              // Backspace
                 (key !== 9) &&              // Horizontal tab
                 (key !== 37) &&             // Percentage
                 (key !== 39) &&             // Single quotes (')
                 (key !== 46))               // Dot
            {
                e.preventDefault();
                return false;
            }
        });
    }
});

但是,如果要使用ng-repeat并且只需要在一定数量的字段中应用此指令,会发生什么情况。好吧,您可以将上层指令转换为准备接受值或值的指令,以便能够确定哪个字段将受到它的影响。

myApp.directive('rsInteger', function() {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            if (attrs.rsInteger === 'true') {
                element.bind('keydown', function(e)
                {
                    var key = e.which || e.keyCode;

                    if (!(key >= 48 && key <= 57) && // Interval (0-9)
                         (key !== 8) &&              // Backspace
                         (key !== 9) &&              // Horizontal tab
                         (key !== 37) &&             // Percentage
                         (key !== 39) &&             // Single quotes (')
                         (key !== 46))               // Dot
                    {
                        e.preventDefault();
                        return false;
                    }
                });
            }
        }
    }
});

要使用此新指令,您只需要在这样的输入类型文本中进行操作,例如:

<input type="text" rs-integer="true">

希望对您有帮助。


感谢Donald.McLean,但不是按键,而是浏览器:keyCode和我在这里发现的内容(stackoverflow.com/questions/4471582/javascript-keycode-vs-which),取决于浏览器。
2014年

131
var intRegex = /^\d+$/;
if(intRegex.test(someNumber)) {
   alert('I am an int');
   ...
}

如果用户输入非负整数以外的任何值,那肯定会肯定失败。


7
如果用户输入一个负整数,这也会失败。
杰森S

3
(当然,年龄不是负数,但是您应该确定要测试任何整数还是任何非负整数。)
Jason S 2009年

6
“ 0”返回true。
Hooray Im帮助

4
具有一个整数元素的数组也返回true(intRegex.test([42]))
Marius Olsthoorn 2012年

2
对于未来的观众,这个答案正在在解释这个问题
gdoron支持Monica

31

对于真正的int检查,请使用以下命令:

function isInt(value) { 
    return !isNaN(parseInt(value,10)) && (parseFloat(value,10) == parseInt(value,10)); 
}

许多int检查的问题是它们为1.0返回“ false”,这是一个有效的整数。此方法检查以确保float和int parsing的值相等,因此对于#.00,它将返回true。

更新:

我将在注释中添加两个注释,以供将来的读者阅读:

  • 首先,当解析使用逗号指示小数位的字符串值时,此方法不起作用。(不足为奇,怎么可能?例如,在美国以“ 1,001”为整数,而在德国则不是。)
  • 其次,自编写此答案以来,在某些浏览器中parseFloat和parseInt的行为已更改,并且随浏览器的不同而不同。ParseInt更具攻击性,它将丢弃出现在字符串中的字母。这对于获取数字非常有用,但对于验证却不太好。

我的建议和实践是使用像Globalize.js这样的库来解析UI的数值/从UI解析数字值,而不是浏览器实现,并且仅对已知的“以编程方式”提供的值(例如从XML文档解析的字符串)使用本机调用。


据我所知,@ Cesar没有编程语言将1,2视为整数或任何单个数值。
ThaMe90

@ ThaMe90没错,但就我而言,我使用的是isInt函数来验证外部输入。在一些使用逗号作为小数点分隔符的国家/地区,“ 1,2”是有效数字。参见:en.wikipedia.org/wiki/File
DecimalSeparator.svg

2
function isInt(value) { return !isNaN(parseInt(value, 10)) && parseInt(value, 10) == parseFloat(value); }在上述情况下应该可以工作。
syserr0r 2012年

3
不要使用此算法!它会告诉你的isInt('5a') == true
machineghost

1
我使用了几乎相同的方法,toString对原始值和转换后的值的方法都进行了测试:var isint = function (a) { return ((parseInt(a) === parseFloat(a)) && (a.toString() === parseInt(a).toString())); }
Ghislain Leveque 2014年

13

使用isNaN(n)

if(isNaN(intValue))

代替

if (intValue == Number.NaN)

1
isNaN()表示不是数字,如果是数字则返回false。只是让我感到困惑:)
石塔

4

我这样做是为了检查数字和整数值

if(isNaN(field_value * 1) || (field_value % 1) != 0 ) not integer;
else integer;

模数除法

示例
1. 25.5%1!= 0
2. 2. 25%1 == 0

并且if(field_value * 1)NaN if字符串,例如:25,34或abcd等... else整数或数字


2

函数isInt(x){返回Math.floor(x)=== x;}


1

如果您的数字在32位整数范围内,则可以使用以下内容:

function isInt(x) { return ""+(x|0)==""+x; }

按位或运算符强制转换为带符号的32位int。双方的字符串转换确保要匹配true / false。


1

没有人尝试过这个简单的事情吗?

function isInt(value) {
    return value == parseInt(value, 10);
}

怎么了


虽然将其表述为问题,但这是对问题的答案。除非我缺少一些微妙之处,否则它甚至是对这个问题的正确答案。
Foon 2015年

parseInt('5HowdyDoody0',10)返回5。这使其不适合验证。
大卫·温德尔肯

0

可以使用对象的isInteger()方法Number

if ( (new Number(x)).isInteger() ) {
  // handle integer
}

如果xundefined或,则此方法正常工作null。但它也有差的浏览器支持现在


0

我发现缺少NaN响应,因为它们没有选择结尾的字符(因此“ 123abc”被认为是有效数字),因此我尝试将字符串转换为整数然后再返回字符串,并确保转换后的字符串与原始字符串匹配:

if ("" + parseInt(stringVal, 10) == stringVal) { alert("is valid number"); }

这对我一直有效,直到数量如此之大,以至于转换期间它们开始以科学计数法的形式出现。

...因此,这当然意味着您可以用科学计数法输入数字,但是如果需要,也可以检查最小值和最大值以防止出现这种情况。

如果使用分隔符(例如“ 1000”或“ 1.000”,具体取决于您的语言环境),它当然会失败-仅在此处允许使用数字。


-4
If (enteredAge < "1" || enteredAge > "130") ......

简单而且有效...直到他们长生不老


继续并使用0xA或15.123进行测试
Sebastian Nowak

是。我想他们可以输入。但我认为这足以满足他的需求。它适用于我的网页ž精
Zardiw

2
我真的不会雇用你的。
塞巴斯蒂安·诺瓦克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.