纯JavaScript:一个类似于jQuery的isNumeric()函数

399

在纯JavaScript中是否有类似于isNumeric的函数?

我知道jQuery有这个函数来检查整数。


4
尝试使用 value => !isNaN(+value)。这个表达式的意思是判断一个值是否为数字,如果不是则返回 true,否则返回 false。 - Hulke
2
isNaN()https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN - Joeri
想要添加isInteger(请注意浮点数不是整数)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger - Jon
6个回答

668

没有 isNumeric() 这样的函数类型,但您可以添加自己的函数:

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

注意:由于parseInt()不是检查数字的正确方式,因此不应使用。


19
这个解决方案源自于Jquery库中的$.isNumeric(obj)函数。参考文档:http://api.jquery.com/jquery.isnumeric/ - ThdK
2
@Matt 我的评论针对答案中的评论和注释,指出parseInt是错误的做法(然后继续使用parseFloat,这似乎并没有什么不同)。有趣的是,isFinite几乎可以在所有情况下单独得到您想要的结果(除了空格字符串,由于某种原因返回true),因此在这种情况下,parseIntparseFloat似乎无关紧要。我肯定找不到任何一个输入函数的例子,其中parseInt会有所不同。 - Vala
3
不要使用此函数,它无法处理浮点数。请参考jQuery的isNumeric实现来获取更多想法。 - tsiege
3
Number.isInteger() 是什么?https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger - kurdtpage
6
请注意,此函数对包含数字元素的单元素数组返回 true:isNumeric([0]) === trueisNumeric(['123']) === true - Timbo White
显示剩余13条评论

209

109
function IsNumeric(val) {
    return Number(parseFloat(val)) == val;
}

7
我认为这个更新版本实际上是最好的答案。我觉得很奇怪它得到的赞数最少。一开始我以为如果使用NaN调用IsNumeric可能会失败,但由于NaN的特殊性质使其不等于任何东西,所以实际上它可以正常工作。 - Vala
4
我认为你可以不用使用 Number() 进行类型转换,而是使用双等号进行一些转换:let isNumeric = (val) => parseFloat(val) == val; 这段代码的意思是判断给定的参数是否为数值类型,它会将传入的参数先转换为浮点数,然后再通过双等号与原始参数进行比较来进行类型转换。 - Mark Birbeck
请解释一下这段代码。为什么不用 Number(val).toString() == val.toString() - x-yuri
1
如果Val未定义,则.ToString将抛出异常。 - Ali Humayun
你可以尝试根据我的需求编写以下代码,我相信许多其他开发人员也会需要:function IsNumeric(val) { return Number(val)==val; }这样可以忽略空字符串的情况。因为我只想验证是否输入了无效值,同时允许空字符串(即非数字)。我认为所有三个答案都是基于不同场景的好答案。 - Ali Humayun
显示剩余5条评论

22

有一个JavaScript函数 isNaN 可以实现这个功能。

isNaN(90)
=>false

所以你可以通过以下方式检查数字

!isNaN(90)
=>true

36
除了 ""、true 和 false 之外,它们都不是非数字。 - commonpike
6
我理解为:"我得到 isNaN(null) === false",意思是:"当我执行 isNaN(null) 时,返回值为 false。" - jayflo
1
isNaN("null") === true; isNaN(null) === false; 对我也是这样 - cmeza
2
isNaN(true) === false; isNaN(false) === false; - cmeza
console.log(isNaN('34.234,23')); // true :-(console.log(isNaN('34.234,23')); // 真 :-( - undefined

19
var str = 'test343',
    isNumeric = /^[-+]?(\d+|\d+\.\d*|\d*\.\d+)$/;

isNumeric.test(str);

6
根据用例而定,这可能是最糟糕的答案。例如,对于“' 1'”或“'0x01'”,此代码将返回“false”,且未考虑本地化因素... - Eric Redon
1
我更喜欢这个答案,如果你正在从字符串或用户输入中读取块,则 isNaN 和 parseInt 可能会导致意想不到的假阳性,例如 "123abc"、"2e1"、"0x2" 等(甚至 jQuery.isNumeric 也会解析为 true)。我会使用类似于这样的函数 function isNumeric(str) { return /^\d*\.{0,1}\d*$/.test(str); } - ebob
3
根据使用情况,这可能是此处最佳答案。 - Zephyr was a Friend of Mine
只要你修剪字符串并不担心替代表示,这就是一个合理的答案。 - Matt Sanders
您没有考虑到地区设置。在一些国家,千位分隔符和小数点的位置可能是相反的。 - undefined

12

isFinite(String(n)) 会对 n=0 或 '0'、'1.1' 或 1.1 返回 true,

但对于 '1 dog' 或 '1,2,3,4'、+- Infinity 和任何 NaN 值,都会返回 false。


20
isFinite(null) --> true, isFinite([]) --> true, isFinite('') trueisFinite(null) --> true :表示 null 转化为数字时,返回的是有限数值 true。isFinite([]) --> true :表示空数组 [] 转化为数字时,返回的是有限数值 true。isFinite('') true:表示空字符串 '' 转化为数字时,返回的是有限数值 true。 - prototype
4
自 ES2015 开始,JavaScript 中有 Number.isFinite 方法。 - Kevin O'Shaughnessy

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