验证JavaScript中的十进制数字-IsNumeric()

在JavaScript中验证十进制数字的最干净,最有效的方法是什么?

奖励积分:

  1. 明晰。解决方案应该干净简单。
  2. 跨平台。

测试用例:

01. IsNumeric('-1')      => true
02. IsNumeric('-1.5')    => true
03. IsNumeric('0')       => true
04. IsNumeric('0.42')    => true
05. IsNumeric('.42')     => true
06. IsNumeric('99,999')  => false
07. IsNumeric('0x89f')   => false
08. IsNumeric('#abcdef') => false
09. IsNumeric('1.2.3')   => false
10. IsNumeric('')        => false
11. IsNumeric('blah')    => false
JinJin乐2020/03/09 17:52:13

isNumeric=(el)=>{return Boolean(parseFloat(el)) && isFinite(el)}

没什么不同,但是我们可以使用布尔构造函数

DavaidAPro2020/03/09 17:52:13
function inNumeric(n){
   return Number(n).toString() === n;
}

如果n为数字,Number(n)则将返回数字值并将toString()其返回为字符串。但是,如果n不为数字,Number(n)则将返回,NaN因此它将与原始值不匹配n

逆天西门2020/03/09 17:52:13

没有答案返回false空字符串,对此的解决方法是...

function is_numeric(n)
{
 return (n != '' && !isNaN(parseFloat(n)) && isFinite(n));
}
小哥Eva2020/03/09 17:52:13

我的解决方案

function isNumeric(input) {
    var number = /^\-{0,1}(?:[0-9]+){0,1}(?:\.[0-9]+){0,1}$/i;
    var regex = RegExp(number);
    return regex.test(input) && input.length>0;
}

它似乎适用于所有情况,但我可能是错的。

Sam神乐番长2020/03/09 17:52:13

我正在使用更简单的解决方案:

function isNumber(num) {
    return parseFloat(num).toString() == num
}
→笑里藏刀↓2020/03/09 17:52:13

这是我使用的一点点改进版本(可能是最快的方式),而不是确切的jQuery变体,我真的不知道他们为什么不使用这个版本:

function isNumeric(val) {
    return !isNaN(+val) && isFinite(val);
}

jQuery版本的缺点是,如果您传递带有前导数字和后缀字母的字符串(如)"123abc"parseFloat | parseInt则会提取出数字分数并返回123,但是,第二个保护措施isFinite无论如何都会使它失败。使用一元运算+符时,它将在第一个后卫上死亡,因为+会给此类混合动力抛出NaN :)一点点的性能,但我认为这是可靠的语义收益。

小卤蛋小小2020/03/09 17:52:13

我认为parseFloat函数可以在这里完成所有工作。以下功能通过了此页面上的所有测试,包括isNumeric(Infinity) == true

function isNumeric(n) {

    return parseFloat(n) == n;
}
蛋蛋LEY2020/03/09 17:52:13

如果我没有记错的话,那么它应该匹配任何有效的JavaScript数字值,但不包括常量(InfinityNaN)和符号运算符+/ -(因为就我而言,它们实际上并不是数字的一部分,因此它们是单独的运算符):

我需要用它作为令牌生成器,在其中不能将数字发送给JavaScript进行评估...绝对不是最短的正则表达式,但是我相信它可以捕获JavaScript数字语法的所有细微差别。

/^(?:(?:(?:[1-9]\d*|\d)\.\d*|(?:[1-9]\d*|\d)?\.\d+|(?:[1-9]\d*|\d)) 
(?:[e]\d+)?|0[0-7]+|0x[0-9a-f]+)$/i

有效数字包括:

 - 0
 - 00
 - 01
 - 10
 - 0e1
 - 0e01
 - .0
 - 0.
 - .0e1
 - 0.e1
 - 0.e00
 - 0xf
 - 0Xf

无效的数字将是

 - 00e1
 - 01e1
 - 00.0
 - 00x0
 - .
 - .e0
GO小胖2020/03/09 17:52:13
return (input - 0) == input && input.length > 0;

没有为我工作。当我发出警报并进行测试时,input.lengthundefined我认为没有属性可以检查整数长度。所以我所做的是

var temp = '' + input;
return (input - 0) == input && temp.length > 0;

工作正常。

Tony阳光2020/03/09 17:52:13

我意识到原始问题没有提到jQuery,但是如果您使用jQuery,则可以执行以下操作:

$.isNumeric(val)

简单。

https://api.jquery.com/jQuery.isNumeric/(自jQuery 1.7起)

NearGreen2020/03/09 17:52:13

无需RegExp即可完成,因为

function IsNumeric(data){
    return parseFloat(data)==data;
}
小小小胖2020/03/09 17:52:13

使用功能isNaN我相信,如果您!isNaN(yourstringhere)对此进行测试,则可以在任何情况下正常工作。

樱Davaid2020/03/09 17:52:13

啊!不要听正则表达式的答案。正则表达式对此很讨厌,我不只是在谈论性能。使用正则表达式使微妙,不可能发现错误非常容易。

如果您不能使用isNaN(),这应该会更好:

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

运作方式如下:

(input - 0)表达式会强制JavaScript在输入值上进行强制转换。首先必须将其解释为减法运算的数字。如果该转换为数字失败,则表达式将为NaN然后将此数字结果与您传入的原始值进行比较。由于左侧现在是数字,因此再次使用强制类型。现在,将双方的输入都从相同的原始值强制转换为相同的类型,您将认为它们应该始终相同(始终为true)。但是,有一条特殊的规则说NaN永远不等于NaN,因此不能转换为数字的值(只有不能转换为数字的值)将导致错误。

长度检查是针对涉及空字符串的特殊情况。还要注意,它取决于您的0x89f测试,但这是因为在许多环境中,这是定义数字文字的一种好方法。如果要赶上特定情况,可以添加其他检查。更好的是,如果这是您不使用的原因,isNaN()那么只需包装您自己的函数isNaN()也可以执行其他检查。

总之,如果您想知道一个值是否可以转换为数字,请实际尝试将其转换为数字。


我回过头来进行了一些研究,研究空白字符串为何没有预期的输出的原因,我想我现在就明白了:一个空字符串被强制为0而不是NaN只需在长度检查之前修剪字符串即可解决这种情况。

针对新代码运行单元测试,它只会在无穷和布尔文字上失败,并且唯一应该出现问题的时间是您是否正在生成代码(真的,谁会输入文字并检查它是否为数字?您应该知道),这将生成一些奇怪的代码。

但是,再次使用此方法的唯一原因是,由于某种原因必须避免使用isNaN()。

Pro逆天猿2020/03/09 17:52:13
function IsNumeric(num) {
     return (num >=0 || num < 0);
}

这也适用于0x23类型编号。