一个改进的isNumeric()函数
An improved isNumeric() function?
在一些项目中,我需要验证一些数据,并尽可能确定这是可用于数学运算的javascript数值。
jQuery和其他一些javascript库已经包含了这样一个函数,通常称为isNumeric。还有一篇关于stackoverflow的帖子被广泛接受为答案,这与前面提到的库正在使用的通用程序相同。
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(/^-/, ''));
}
如果您担心每次调用函数时都会创建regex,那么您可以在闭包中重写它,类似于以下
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个测试用例,并在jsfiddle上克隆了测试,添加了我额外的测试用例和我上面描述的解决方案。
一切似乎都按预期进行,我没有遇到任何问题。你能看到任何问题,代码或理论问题吗?
它可能不会取代被广泛接受/使用的答案,但如果这是你期望的isNumeric函数的结果,那么希望这会有所帮助。
EDIT:正如Bergi所指出的,还有其他可能的对象可以被视为数字对象,白名单比黑名单更好。考虑到这一点,我将添加到标准中。
我希望我的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")
如果可以使用正则表达式,这可能会起到作用:
function (n)
{
return (Object.prototype.toString.call(n) === '[object Number]' ||
Object.prototype.toString.call(n) === '[object String]') &&
(typeof(n) != 'undefined') && (n!=null) &&
(/^-?'d+((.'d)?'d*(e[-]?'d)?('d)*)$/.test(n.toString()) ||
/^-?0x[0-9A-F]+$/.test(n.toString()));
}
edit:修复了十六进制数字的问题
如果AMD听起来不错,请查看mout的isNumber((。
function isNumber(value){return typeof value == 'number';}
怎么样:
function isNumber(value) {
value = Number(value);
return typeof value === 'number' && !isNaN(value) && isFinite(value);
}
代码:
<script>
function IsNumeric(val) {
if (isNaN(parseFloat(val))) {
return false;
}
return true
}
bool IsNumeric(string);
</script>
function isNumber(value){
return !isNaN(parseFloat(value)) &&
isFinite(value.toString().replace(/^-/, '')) &&
typeof value !== 'object';
}
或:
function isNumber(value){
return !Array.isArray(value) && !isNaN(parseFloat(value)) &&
isFinite(value.toString().replace(/^-/, '')) &&
Object.prototype.toString.call(value) !== '[object Object]';
}
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- jquery点击函数select&取消选择
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- Node.js v6.2.0类扩展不是函数错误
- 比较从函数和生成的日期对象
- jQuery中是否内置了任何字符串格式化函数
- 一个改进的isNumeric()函数