改进的 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() 函数? 的相关文章

  • Firebase Function 从其他文件导入函数 - javascript

    我正在使用 javascript 构建 firebase 函数 现在我有很多内部调用函数 我计划将这些函数移动到不同的文件中 以避免 index js 变得非常混乱 下面是当前的文件结构 functions index js interna
  • 域驱动设计中输入验证应该放在哪里?

    我想知道我们到底应该在哪里放置输入验证 想象一下 API 调用发送输入以应用用户的空闲时间 在服务层注入验证类并在服务内部调用验证方法是否正确 或者最好将其放在基础设施层甚至领域模型中 我只是想看看在域驱动设计方法中实现 API 输入验证的
  • 未捕获的类型错误:无法读取未定义的属性“toLowerCase”

    我收到此错误 它源自 jquery 框架 当我尝试加载准备好的文档上的选择列表时 出现此错误 我似乎无法找到为什么会出现此错误 它适用于更改事件 但在尝试手动执行该函数时出现错误 未捕获的类型错误 无法读取未定义的属性 toLowerCas
  • 如何使用自定义 ValidationAttribute 来确保两个属性匹配?

    我们使用 xVal 和标准DataAnnotationsValidationRunner描述here http blog stevensanderson com 2009 01 10 xval a validation framework
  • Child_process 处理带有回车符 (\r) 的 STDOUT 流

    我正在编写一个简单的应用程序 它允许工作中的内部系统请求从远程服务器到使用 REST 调用发起的另一个远程服务器的复制过程 使用 rsync 我已经对express框架足够熟悉 并且刚刚开始尝试child process库 并偶然发现了一个
  • 为什么 JSON.stringify 对于似乎具有属性的对象返回空对象符号“{}”?

    下面的例子表明JSON stringify 返回字符串 对于 SpeechSynthesisVoice 对象 var voiceObject window speechSynthesis getVoices 0 JSON stringify
  • 使用 jquery 通配符检查 cookie 名称

    我有一个生成动态 cookie 的表单 例如 webform 62 1234356 62 1234356 可以是任意数字 我需要使用一些通配符检查来检查名称以 webform 开头的 cookie 是否存在 下面不起作用 if cookie
  • mouseover 和 mouseout 事件在子进程上触发

    代码 div div div div 如果我将鼠标悬停在Navigation the Drop Downdiv 向下滑动 如果我将鼠标移开 它会向上滑动 问题是如果我将鼠标悬停在孩子上Drop Downdiv它也向上滑 动 有谁知道我该如何
  • Backbone 中的加载栏

    我想显示加载消息 图标 直到列表中的所有项目都已呈现 这是我的示例中的 jsfiddle http jsfiddle net 9R9zU 58 http jsfiddle net 9R9zU 58 我尝试在 Feed 部分添加一个带有加载栏
  • jQuery 在 Chrome 下发现错误元素

    我使用 jQuery 迭代 HTML 表 并动态填充每行的行号 通过在文本框中填充行号 function updateRowNums myTable find tr each function index this find input i
  • 监听浏览器宽度以进行响应式网页设计?

    我正在努力使我的网站适合移动设备 我想知道浏览器窗口的大小 以便当它比 728px 窄时我可以执行某些操作 而当它大于 728px 时我可以执行其他操作 这必须考虑到调整 PC 上的窗口大小以及在手机中从纵向模式更改为横向模式 如何才能做到
  • 当条件评估为 true 时获取元素(扩展 ElementArrayFinder)

    我们有一个菜单 表示为ul gt li列表 简化 ul class dropdown menu li class ng scope a href class ng binding Menu Item 1 a li li li ul
  • 如何检查 Map 或 Set 是否为空?

    对于 JavaScript 中的传统对象 使用以下命令很容易检查它是否为空 Object keys method const emptyObj console log Object keys emptyObj length 0 true i
  • React + Semantic-UI:在 UI MODAL 中使用表单

    在没有 React 的普通旧 Semantic UI 中 我已经能够毫无问题地将表单放入 Modal 中 使用 Semantic UI React 版本 我能够在模态中显示表单 但它并没有按照我期望的方式工作 例如 模态框显示后 模态框内的
  • 水平平滑滚动 100px

    Heyjo problem 一周以来我一直在寻找 javascript 或 jQuery 代码 以便在我的网站上实现滚动按钮 我失败的那一刻是按钮应该多次工作的时候 他的任务不是滚动到专用元素 而是应该向左滚动 例如 100px 此外 滚动
  • Cosmos DB 中的 MaxItemCount 源选项属性不起作用

    我正在尝试编写一个运行 SQL 查询的简单存储过程 并且我想通过使用 MaxItemCount 属性来限制结果 查询生成 3 个文档 但我只想返回 1 个文档 我使用 MaxItemCount 属性强制执行此限制 但这似乎不起作用 func
  • 如何查看网站浏览者的操作系统?

    我运行的是 Ubuntu 8 04 最近在访问网站时收到以下错误 请使用运行 Windows 98 2000 Me NT 或 XP 的计算机返回 www site com 网站如何知道我正在运行哪个操作系统 是仅通过 javascript
  • D3v6 嵌套图 - 嵌套 join()?

    我想可视化每个节点的 孩子 洞察力 我猜 D3v6 join 函数可以嵌套 不幸的是我找不到任何例子 下面的代码片段包含一个具有 3 个节点和子节点作为属性的outerGraph 到目前为止 这些孩子还没有被使用 相反 innerGraph
  • 使用 javascript Array reduce() 方法有什么真正的好处吗?

    reduce 方法的大多数用例都可以使用 for 循环轻松重写 对 JSPerf 的测试表明 reduce 通常会慢 60 75 具体取决于每次迭代内执行的操作 除了能够以 函数式风格 编写代码之外 还有什么真正的理由使用reduce 吗
  • WooCommerce 使用 AJAX 设置购物车数量?

    我已经为此绞尽脑汁好几天了 需要一些指导 我正在为 WooCommerce 网站完全从头开始制作自定义主题 现在我正在尝试让购物车功能正常工作 我一直试图使用按钮 来更新购物车中产品的数量 对我来说问题似乎是WC 我在functions p

随机推荐