在JavaScript中检查文本框的值是否为整数。

7

如何检查文本框中输入的内容是否为整数?我使用了NAN函数,但它也接受十进制值。

我该怎么做?有没有内置方法?


只是注意到Number.isInteger是在ECMA-262 ed 6,也就是ECMAScript 2015中添加的。 - RobG
7个回答

17

假设文本框由变量intfield引用,然后您可以像这样检查它:

var value = Number(intfield.value);
if (Math.floor(value) == value) {
  // value is an integer, do something based on that
} else {
  // value is not an integer, show some validation error
}

这将把空字符串或仅包含空格的字符串视为有效整数。如果 intfield.value 为空字符串,则 Number("") 返回0,而 Math.floor(value) == value 返回true。如果将 value 留为空字符串,则也返回true。 - RobG

1

正则表达式将是一种方法:

var re = /^-?\d\d*$/
alert(re.test(strNumber)); // leading or trailing spaces are also invalid here

带更新的完整示例:

http://rgagnon.com/jsdetails/js-0063.html

function validateInteger( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains only
    valid integer number.

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.
**************************************************/
  var objRegExp  = /(^-?\d\d*$)/;  

  //check for integer characters
  return objRegExp.test(strValue);
}

更新以处理空格 - 这可能在验证中不被允许,但在这里可以使用: 可以继续使用我给出的链接中的代码(leftTrim/rightTrim),但是在这里我重用了 JavaScript 中的 .trim() 不在 IE 中工作 的 trim。

function ignoreLeadingAndtrailingWhitespace( strValue ) {
  return strValue.length>0?validateInteger( strValue.trim() ):false;
}

if(typeof String.prototype.trim !== 'function') { 
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ''); 
  }
}


function validateInteger( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains only
    valid integer number.

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.
**************************************************/
  var objRegExp  = /(^-?\d\d*$)/;

  //check for integer characters
  return objRegExp.test(strValue);
}

你有一个不必要的捕获组,这并不太重要,因为你只是在使用 test,但仍然很奇怪。此外,它没有考虑开头或结尾的空格。 - Brian Donovan
告诉Gagnon吧 ;) 我只是个传话者,但我明白了 - 更新正在路上。 - mplungjan
1
更新了,但在仅验证整数时,可能会将前导和尾随空格视为无效。 - mplungjan

1
// validate if the input is numeric and between min and max digits
function validateNumberSize(inputtxt, min, max)
{
    var numbers = /^[0-9]+$/;
    if(inputtxt.match(numbers))
    {
        if(inputtxt.length >= min && inputtxt.length <= max)
        {
            return true;
        }
    }
    return false;
}

0
最好使用以下正则表达式:
function isInteger(str) {
    var r = /^-?[0-9]*[1-9][0-9]*$/;
    return r.test(str);
}

这只是一个测试演示:

> function isInteger(str) {
...     var r = /^-?[0-9]*[1-9][0-9]*$/;
...     return r.test(str);
... }
> isInteger("-123")
true
> isInteger("a123")
false
> isInteger("123.4")
false

0

如果你要寻找整数或小数,可以选择:

function IsNumeric(input)
{
   return (input - 0) == input && input.length > 0;
}

如果一个字符串包含空格,它会返回 true。在调用长度之前应该修剪输入:... && input.trim().length > 0 - The Bitman

0
var num = document.getElementById("myField").value;
if(/^\d+$/.test(num)) {
    // is an int
}

你不能对数字执行正则表达式匹配。 - Brian Donovan
刚刚摆脱了parseInt,意识到那是错误的。谢谢Brian。 - karim79
负整数未处理。 - mplungjan
@mplungjan - 这也是真的。 - karim79

0

表单数据始终是文本。我的建议是将其解析为整数并与原始值进行比较:

var sampleData = ["not a number", "0", "10", "3.14", "-12", "-0.34", "2e10", "34foo", "foo34"];
var integers = [], notIntegers = [];
for(var i=0, len=sampleData.length; i<len; i++){
    var original = sampleData[i];
    var parsed = parseInt(original, 10);
    if( !isNaN(parsed) && original==parsed ){
        integers.push(parsed);
    }else{
        notIntegers.push(original);
    }
}
alert("Integers: " + integers.join(", ") + "\nNot integers: " + notIntegers.join(", "));

这显示:

Integers: 0, 10, -12
Not integers: not a number, 3.14, -0.34, 2e10, 34foo, foo34

科学计数法和千位分隔符都不被支持。如果这是一个问题,你需要使用其他方法 ;)

更新:我想要明确的是,这只是其中一种可能的方法,而不是唯一的真理。如果您需要对数据进行数学运算,那么这种方法是有意义的,因此您必须获取数字变量。


我认为与 /^-?\d\d*$/ 相比,这有点过度杀伤力了,你的函数在哪里? - mplungjan
当然,相比于一行代码,两行代码有些过度了,因为它们的代码量正好是两倍。我真是太丢人了。(你真的需要帮助将其封装成一个函数吗?) - Álvaro González

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接