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


324

我想检查a是否string仅包含数字。我用这个:

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

if (isANumber){
    ..
}

但意识到它也允许+-。基本上,我要确保input只能包含数字,而不能包含其他字符。由于+100-5都是数字,isNaN()所以不是正确的方法。也许我需要一个正则表达式?有小费吗?

Answers:


644

怎么样

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

1
这很棒!我很好奇\ d不是指十进制数字吗?
2015年

5
@dewwwald:有些语言以不同的方式实现它,但是在JavaScript中,\d完全等同于[0-9]
Ry-

在这里 您可以找到有关Regular Expressions工作方式的文档
Danfoa

6
/^\d*$/相反,如果您发现一个仅包含数字的空字符串。
35КонстантинВан

@DrorBar我为我的英语不好对不起,让我改写一下:“如果您认为一个空字符串仅包含数字。”
КонстантинВан”,19年


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

2
用Javascript修改内置对象的原型(最不惊奇的原则,以及将来的ECMA版本中的潜在冲突)被认为是一种不好的做法- isNumber = () => /^\d+$/.test(this);相反,请考虑并用作console.log(isNumber("123123));
Nick Bull

2
FWIW,在2009年发布此答案时,尚未将其视为不良做法。在jQuery尚未胜出之前,当时存在的几个jQuery竞争对手都实践了原型扩展。
balupton

14

如果您甚至想要支持浮点值(点分隔值),则可以使用以下表达式:

var isNumber = /^\d+\.\d+$/.test(value);

但是,如果您不使用浮点数而不是int,则可能会使用“?”返回false。在“。\”解决之后。我建议使用此/^\d+[\.,\,]?\d+$/.test(value)允许逗号和小数点(以后可以将逗号转换为小数点)
幸运的是,

@Lucke,您建议的正则表达式将只能查找十进制或大于9的数字。如果将第一个更改\d+\d*?,它将能够匹配0-9以及.333
Gust van

5
关闭:var isNumber = /^\d*\.?\d+$/.test(value)-匹配“ 3.5”,“。5”,“ 3” –不匹配“ 3”。
彼得·霍林斯沃思

7

这是检查字符串是否仅包含数字的另一种有趣且易读的方法。

此方法通过使用spread运算符将字符串拆分为数组来工作,然后使用该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
这也将返回true空字符串''和空数组[],即整数数组[1, 2, 3](一旦它们小于10)。比/^\d+$/我认为的基本正则表达式更容易出现错误/滥用
Drenai


5

这是不使用正则表达式的解决方案:

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”的字符代码。


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

尽管这将返回false带有前导或尾随零的字符串。


2

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

^\d+$

1

如果要包含浮点值,也可以使用以下代码

theValue=$('#balanceinput').val();
var isnum1 = /^\d*\.?\d+$/.test(theValue);
var isnum2 =  /^\d*\.?\d+$/.test(theValue.split("").reverse().join(""));
alert(isnum1+' '+isnum2);

这将仅测试数字和以“。”分隔的数字。第一个测试将覆盖诸如0.1和0的值,但也覆盖.1,它将不允许0。因此,我建议的解决方案是反转theValue,使.1为1。然后相同的正则表达式将不允许它。

例如:

 theValue=3.4; //isnum1=true , isnum2=true 
theValue=.4; //isnum1=true , isnum2=false 
theValue=3.; //isnum1=flase , isnum2=true 

-1
c="123".match(/\D/) == null #true
c="a12".match(/\D/) == null #false

如果字符串仅包含数字,则将返回null

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.