我有一个文本字段,允许用户输入他们的年龄。我正在尝试使用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。如何确保用户只输入整数?
谢谢
答案 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。
更新:
我将在未来读者的答案中添加两个问题:
我的建议和做法是使用像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
}
如果x
为undefined
或null
,此方法可正常运行。但它现在有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") ......
简单而且有效....直到他们发展不朽