检查字符串是否只包含数字

520

我想检查一个string是否只包含数字。 我使用了这个:

var isANumber = isNaN(theValue) === false;

if (isANumber){
    ..
}

但是我发现它还允许+-。基本上,我想确保一个input只包含数字而没有其他字符。由于+100-5都是数字,所以isNaN()不是正确的方法。 也许正则表达式是我需要的?有什么建议吗?

15个回答

1038

怎么样?

let isnum = /^\d+$/.test(val);

15
在一些编程语言中,\d 的实现方式可能不同,但是在 JavaScript 中,\d 恰好等价于 [0-9] - Ry-
2
在这里,您可以找到有关正则表达式如何工作的文档:https://www.w3schools.com/js/js_regexp.asp - Danfoa
13
如果您发现一个仅包含数字的空字符串,可以使用 /^\d*$/ 来代替。请注意,该正则表达式用于匹配仅由数字组成的字符串。 - Константин Ван
4
@DrorBar,非常抱歉我的英语不好,让我重新表述一下:“如果您认为一个空字符串是_只有数字_。” - Константин Ван
2
这个解决方案很好,但对于像 000000001 这样的东西也是正确的。 - Arian Faurtosh
显示剩余6条评论

98
string.match(/^[0-9]+$/) != null;

24
String.prototype.isNumber = function(){return /^\d+$/.test(this);}
console.log("123123".isNumber()); // outputs true
console.log("+12".isNumber()); // outputs false

11
在JavaScript中,修改内置对象的原型被认为是一种不良实践(违背最小惊奇原则,并可能在未来的ECMA版本中引起冲突)。相反,可以考虑使用 isNumber = () => /^\d+$/.test(this); 并像这样使用:console.log(isNumber("123123));。请注意,这不会改变原意。 - Nick Bull
7
值得一提的是,当这个答案发布于2009年时,它还没有被认为是一种不好的做法。在jQuery赢得胜利之前存在着几个jQuery竞争对手,它们都采用了原型扩展的做法。 - balupton
尽管jQuery爱好者并不认为这是一种不良实践,但它仍然是一种不良实践。 - Sergei Kovalenko

21
如果你想支持浮点数(用点分隔的值),那么你可以使用这个表达式:
var isNumber = /^\d+\.\d+$/.test(value);

如果你使用整数而不是浮点数,它将返回假。也许在“.\”后面加上“?”可以解决这个问题。我建议使用 /^\d+[.,,]?\d+$/.test(value) 来允许逗号和点表示小数(稍后可以将逗号转换为点)。 - Lucke
2
@Lucke,你提出的正则表达式只能找到小数或大于9的数字。如果你将第一个\d+改为\d*?,它就能匹配0-9以及像.333这样的数字了。 - Gust van de Wal
7
闭包:var isNumber = /^\d*\.?\d+$/.test(value) -- 匹配 '3.5', '.5', '3' -- 不匹配 '3.' - Peter Hollingsworth
自2009年以来,这个问题一直在询问如何验证一个字符串是否只包含数字。而本篇文章则是对另一个问题的正确回答。 - mickmackusa
1
@PeterHollingsworth 这无法匹配负数,例如 -100.2 - dewey

18

这里有一种有趣且易读的方法来检查一个字符串是否只包含数字。

这种方法通过使用展开运算符将字符串拆分为数组,然后使用every()方法测试数组中的所有元素(字符)是否都包含在数字字符串'0123456789'中:

const digits_only = string => [...string].every(c => '0123456789'.includes(c));

console.log(digits_only('123')); // true
console.log(digits_only('+123')); // false
console.log(digits_only('-123')); // false
console.log(digits_only('123.')); // false
console.log(digits_only('.123')); // false
console.log(digits_only('123.0')); // false
console.log(digits_only('0.123')); // false
console.log(digits_only('Hello, world!')); // false


1
这也会对空字符串''、空数组[]以及整数数组[1, 2, 3](一旦它们小于10)返回true。相比基本正则表达式/^\d+$/,它更容易出现错误/误用。 - Drenai
3
这比正则表达式容易阅读,而且很容易扩展到其他方法。当在TypeScript中与长度检查结合使用时,这会非常优雅。 - krillgar
1
我喜欢它的独特性,但是这个解决方案在性能密集或数据重的客户端上使用最“资源消耗”,因为需要对每个输入字符进行10倍的操作,所以不可扩展。 - KingJulian

11

以下是一种不使用正则表达式的解决方案:

function onlyDigits(s) {
  for (let i = s.length - 1; i >= 0; i--) {
    const d = s.charCodeAt(i);
    if (d < 48 || d > 57) return false
  }
  return true
}

48和57分别是字符"0"和"9"的字符编码。


10

This is what you want

function isANumber(str){
  return !/\D/.test(str);
}

3
此答案允许空字符串作为有效数字。 - mickmackusa

8

如果你需要同时进行整数和浮点数验证

/^\d+\.\d+$|^\d+$/.test(val)


自2009年以来,这个问题一直在询问如何验证一个字符串是否只包含数字。而本篇文章则是对另一个问题的正确回答。 - mickmackusa

5
function isNumeric(x) {
    return parseFloat(x).toString() === x.toString();
}

尽管如此,在具有前导或尾随零的字符串上,这将返回false

4

好的,您可以使用以下正则表达式:

^\d+$

不适用于浮点数。 - myverdict
不适用于浮点数。 - undefined
1
浮点数不仅包含数字,还可能包含小数点。既然问题是关于数字而不是可以解析为数字的事物,所以答案有效。 - Joey
1
浮点数不仅仅包含数字,它们很可能还包括小数点。既然问题是关于数字而不是可以解析为数字的事物,那么答案是正确的。 - undefined

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