如何在JavaScript中验证数字(包括浮点数)

27

目前我正在使用这个正则表达式:

var valid = (value.match(/^\d+$/));

但是对于像'0.40'或'2.43'这样的数字,这并不起作用。我该如何修改上面的正则表达式以匹配浮点数?

10个回答

63
你不需要使用正则表达式!isNaN会将你的值转换为Number类型:
var valid = !isNaN(value);

例如:

!isNaN('0'); // true
!isNaN('34.56'); // true
!isNaN('.34'); // true
!isNaN('-34'); // true
!isNaN('foo'); // false
!isNaN('08'); // true

勉强修改(感谢CMS):

该死的类型强制转换,!isNaN('')!isNaN(' ')!isNaN('\n\t')等都是true

空格测试+isNaN胜利:

var valid = !/^\s*$/.test(value) && !isNaN(value);

呕。


3
很有趣,因为被接受的答案不接受负数 :) - llamaoo7
4
被接受的答案也不接受像.4237.这样的数字。 - James Cronen
2
该死的JavaScript!在我的书里,"[tab][space][tab]"是不是数字!:-P - scunliffe
更好的写法? var valid = !isNaN(value.trim()) - Dhanushka

37
var valid = (value.match(/^-?\d*(\.\d+)?$/));

我的错。更正后的条目应该解决没有小数点前面的数字的情况。我假设使用正则表达式来回答这个问题有一些原因(而不是使用isNaN),比如将其与某些验证框架联系起来。 - mkedobbs
1
这也匹配“”(空字符串)和“-”(单破折号)。 - stephband
2
这个错误的正则表达式标记不合法,例如以下是合法的数字: +42 42. 42e42 - sarkiroka

28
继续采用@Crescent Fresh的方法,不久之前,我需要进行数字验证,但是我需要验证一个变量是否包含数字,而不知道它的类型,它可以是包含数字值的String(我还必须考虑指数符号等),也可以是Number对象,基本上是任何我无法做出任何类型假设的东西。
我还必须注意隐式类型转换,例如如我向@Crescent指出的那样,isNaN对我的情况不够用:
// string values
!isNaN(' ') == true;
!isNaN('\t\t') == true;
!isNaN('') == true;

// boolean values
!isNaN(true) == true;
!isNaN(false) == true;

// etc..

最终我编写了一组30+ 单元测试,你可以在这里找到并运行,下面的函数是通过了我所有测试的函数:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

赢了!刚发现这个:https://dev59.com/3nVD5IYBdhLWcg3wU56H 你需要在那里添加这个答案。被接受的答案无法正确处理空格字符串。 - Crescent Fresh
@Crescent:哈哈,实际上它在我的10个测试中失败了,我马上会把它加进去…… - Christian C. Salvadó
@Crescent:谢谢,QUnit测试运行器确实非常灵活。我已经添加了我的答案,但我认为它可能仍然被埋在底部... https://dev59.com/3nVD5IYBdhLWcg3wU56H#1830844 - Christian C. Salvadó
这样的回答让我希望我能给予超过+1的评价。任何有那么多测试支持的东西都值得至少2个赞 :) - Dan M
jQuery.isNumeric 也通过了你的所有测试。 - ivan.a.bovin
显示剩余2条评论

8
这是我的正则表达式版本。
var n = /^[+-]?((\.\d+)|(\d+(\.\d+)?))$/;

匹配

n.test('3');
n.test('3.0');
n.test('0.3');
n.test('.3');
n.test('+3');
n.test('+3.0');
n.test('+0.3');
n.test('+.3');
n.test('-3');
n.test('-3.0');
n.test('-0.3');
n.test('-.3');

不匹配

n.test('');
n.test('+');
n.test('-');

这也无法匹配指数科学计数法表示的有效浮点数,例如 1E-6(0.000001)或 1E6(1000000)。 - Wilt
3
这个正则表达式无法匹配以小数点结尾的数字,例如 3.。为了匹配这种情况,我使用了以下正则表达式:/^[+-]?((\.\d+)|(\d+(\.\d+)?)|(\d+\.))$/ - nemo

1
你可以尝试我的解决方案:/^-?\d+(\.?\d+)?$/.test(text)

0
var valid = (value.match(/^[\d.]+$/));

2
你的表达式是"一到无限位数或点",那么像"1.1.1...1"这样的表达式是否有效呢?我猜这不是浮点数。 - Emmanuel Devaux

0

这里是没有使用任何正则表达式的验证,使用了元素本身的“validity”属性:

var valid = input_element.validity.valid;

1
-1?我认为这很明显,特别是上面有许多行代码也不需要任何注释。主题本身描述了这段代码正在做什么。它验证了某些<input>元素的输入正确性。没有任何正则表达式。 - Aleksey Kuznetsov

0
这是一个正则表达式,它接受并捕获所有有效的非负浮点数(但它不处理指数):
((?:\d+\.\d*)|(?:\d*\.?\d+))

接受1、1.0、1.、0.1、.1,但不接受“.”或带有多个“.”的任何内容。

请参见regex101上的示例:https://regex101.com/r/t7eikU/1


0
var valid = value.match(/\d+?\.\d+/);

3
不会匹配“-2.4”,但会匹配“23&56”。 - Kusalananda

0

这是我使用的

/[\+]?([\-]?([0-9]{1,})?[\.]?[0-9]{1,})/

这个正则表达式匹配的是"00.0",但它不是一个有效的浮点数。该正则表达式不会消耗掉结尾的小数点,例如"1."。同时,它也不允许符号(+-)和数值之间有空格,例如"+ 1"。 - cquezel

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