JavaScript – testing一个整数

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

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; } 

奇怪的是,我已经input单个字符到文本框中,如“b”,这个方法返回true。 我如何确保用户只input一个整数?

谢谢

UPDATE

我已经修复了有错误的代码,并添加了一个名为key的var来存储使用keyCode的按键代码,以及哪个取决于浏览器。

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

谢谢Donald.McLean 🙂


如果你想在input的时候检查你是否正在写数字(并避免在input字段中写入其他字符),你可以使用这个简单的函数,并且可以定义允许的元素(包括你想要过滤的元素)。 通过这种方式,您不仅可以select整数,还可以select特定的一组字符。 该示例基于jQuery将其附加到input字段。

 $('#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应用的任何领域中创build的指令:

 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; } }); } } } }); 

要使用这个新的指令,你只需要像这样的inputtypes的文本,例如:

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

希望它可以帮助你。

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

如果用户input的不是非负整数,那绝对会失败。

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

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

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

更新:

我将在未来读者的答案中join评论中讨论了两个问题:

  • 首先,在parsing使用逗号来指示小数位的string值时,此方法不起作用。 (毫不奇怪,怎么可能呢?以美国为例,“1,001”是整数,德国则不是)。
  • 其次,parseFloat和parseInt的行为在某些浏览器中已经改变了,因为这个答案是由浏览器编写的。 ParseInt更具侵略性,会丢弃出现在string中的字母。 这对于获得一个数字是很好的,但对于validation来说不是那么好。

我的build议和做法是使用像Globalize.js这样的库来为用户界面(UI)而不是浏览器实现parsing数字值,并仅使用已知的“编程方式”提供的值(如从XML文档parsing的string。

使用isNaN(n)

 if(isNaN(intValue)) 

代替

 if (intValue == Number.NaN) 

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

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

模块化部门


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

如果(field_value * 1)NaN如果string例如:25,34或abcd etc … else整数或数字

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

如果你的号码是在32位整数范围内,你可以用类似的东西:

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

按位或操作符强制转换为带符号的32位整数。 双方的string转换确保真/假想匹配。

没有人试过这个简单的东西?

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

那有什么问题?

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

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

如果x undefined或为null此方法正常工作。 但现在浏览器支持很差

我发现NaN响应缺乏,因为他们没有拿起尾随字符(所以“123abc”被认为是一个有效的数字),所以我试图将string转换为一个整数,并返回到一个string,并确保它匹配转换后的原始:

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

这对我来说一直工作,直到数字如此之大,他们开始出现在转换过程中的科学记数法。

…所以当然这意味着你可以用科学记数法input一个数字,但是检查最小值和最大值也可以防止这种情况发生。

如果您使用分隔符(如“1,000”或“1.000”取决于您的区域设置),那么当然会失败 – 只允许在这里input数字。

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

简单,它的作品….直到他们发展不朽