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") ......
简单,它的作品….直到他们发展不朽