JavaScript - 测试整数

时间:2009-06-19 18:50:53

标签: javascript

我有一个文本字段,允许用户输入他们的年龄。我正在尝试使用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。如何确保用户只输入整数?

谢谢

11 个答案:

答案 0 :(得分:131)

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

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

答案 1 :(得分:31)

对于真正的int检查,请使用:

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

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

更新:

我将在未来读者的答案中添加两个问题:

  • 首先,在解析使用逗号表示小数位的字符串值时,此方法不起作用。 (这并不奇怪,怎么可能呢?例如在美国给出“1,001”这是一个整数,而在德国却不是。)
  • 其次,parseFloat和parseInt的行为在某些浏览器中已经改变,因为这个答案是由浏览器编写的并且因浏览器而异。 ParseInt更具攻击性,会丢弃字符串中出现的字母。这非常适合获取数字但不太适合验证。

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

答案 2 :(得分:13)

使用isNaN(n)

if(isNaN(intValue))

取代

if (intValue == Number.NaN)

答案 3 :(得分:8)

<强>更新

我修复了有错误的代码并添加了一个名为 key 的var来存储使用 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会发生什么,你只需要在一定数量的字段中应用这个指令。好吧,您可以将upper指令转换为准备接受 true false 值的指令,以便能够确定哪个字段会受其影响。

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">

希望它对你有所帮助。

答案 4 :(得分:4)

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

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

Modular Divison

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

和     if(field_value * 1)NaN if string例如:25,34或abcd等...     其他整数或数字

答案 5 :(得分:2)

  

function isInt(x){return Math.floor(x)=== x;}

答案 6 :(得分:1)

如果您的号码在32位整数范围内,您可以选择以下内容:

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

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

答案 7 :(得分:1)

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

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

这有什么不对?

答案 8 :(得分:0)

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

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

如果xundefinednull,此方法可正常运行。但它现在有poor browser support

答案 9 :(得分:0)

我发现NaN响应缺乏,因为他们不会接受尾随字符(所以&#34; 123abc&#34;被认为是有效数字)所以我尝试将字符串转换为整数并返回到字符串,并确保它在转换后与原始字符匹配:

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

这对我有用,直到数字如此之大,它们在转换过程中开始显示为科学记数法。

...所以当然这意味着你可以用科学记数法输入一个数字,但如果你愿意,也可以检查最小值和最大值。

如果您使用分隔符(例如&#34; 1,000&#34;或&#34; 1.000&#34;取决于您的语言环境),它当然会失败 - 只允许使用数字。

答案 10 :(得分:-4)

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

简单而且有效....直到他们发展不朽