改进的 isNumeric() 函数?

2024-03-31

在一些项目中,我需要验证一些数据,并尽可能确定它是可用于数学运算的 JavaScript 数值。

jQuery 和其他一些 javascript 库已经包含这样的函数,通常称为 isNumeric。还有一个发布在 stackoverflow 上 https://stackoverflow.com/a/1830844/592253这已被广泛接受为答案,与上述库使用的常规例程相同。

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

由于是我的第一篇帖子,我无法在该帖子中回复。我对已接受的帖子遇到的问题是,似乎有一些极端情况影响了我正在做的一些工作,因此我做了一些更改来尝试解决我遇到的问题。

首先,如果参数是长度为 1 的数组,并且该单个元素的类型被上述逻辑视为数字,则上面的代码将返回 true。在我看来,如果它是一个数组,那么它就不是数字。

为了缓解这个问题,我添加了一个检查以从逻辑中折扣数组

function isNumber(n) {
  return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n);
}

当然,你也可以使用Array.isArray代替Object.prototype.toString.call(n) !== '[object Array]'

EDIT:我已经更改了代码以反映数组的通用测试,或者您可以使用 jquery$.isArray或原型Object.isArray

我的第二个问题是负十六进制整数文字字符串(“-0xA”-> -10)不被计为数字。但是,正十六进制整数文字字符串 ("0xA" -> 10) 被视为数字。我需要两者都是有效的数字。

然后我修改了逻辑以考虑到这一点。

function isNumber(n) {
  return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}

如果您担心每次调用函数时都会创建正则表达式,那么您可以在闭包中重写它,如下所示

isNumber = (function () {
  var rx = /^-/;

  return function (n) {
      return Object.prototype.toString.call(n) !== '[object Array]' && !isNaN(parseFloat(n)) && isFinite(n.toString().replace(rx, ''));
  };
}());

然后我参加了 CMS+30 个测试用例 http://dl.getdropbox.com/u/35146/js/tests/isNumber.html并克隆了在 jsfiddle 上测试 http://jsfiddle.net/Xotic750/2q8pp/embedded/result/添加了我的额外测试用例和上述解决方案。

一切似乎都按预期进行,我没有遇到任何问题。您可以看到任何代码或理论问题吗?

它可能不会取代广泛接受/使用的答案,但如果这是您所期望的 isNumeric 函数的结果,那么希望这会有所帮助。

EDIT: 正如所指出的Bergi https://stackoverflow.com/a/15230431/592253,还有其他可能的对象可以被视为数字,并且白名单比黑名单更好。考虑到这一点,我会添加标准。

我希望我的 isNumeric 函数仅考虑数字或字符串

考虑到这一点,最好使用

function isNumber(n) {
  return (Object.prototype.toString.call(n) === '[object Number]' || Object.prototype.toString.call(n) === '[object String]') &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}

这已添加为测试 22


在我看来,如果它是一个数组,那么它就不是数字。为了缓解这个问题,我添加了一个检查以从逻辑中折扣数组

您也可能会遇到任何其他对象的问题,例如{toString:function(){return "1.2";}}。您认为哪些对象是数字?Number物体?没有任何?

您不应尝试将某些未通过测试的事物列入黑名单,而应明确将您想要成为数字的事物列入白名单。你的函数应该得到什么,原始字符串和数字?然后对它们进行精确测试:

(typeof n == "string" || typeof n == "number")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

改进的 isNumeric() 函数? 的相关文章

随机推荐