一个改进的isNumeric()函数?

在一些项目中,我需要validation一些数据,并尽可能确定它是可以在math运算中使用的javascript数值。

jQuery和其他一些JavaScript库已经包含这样一个函数,通常称为isNumeric。 在stackoverflow上也有一个post被广泛接受为答案,这是前面提到的库所使用的相同的一般例程。

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

作为我的第一篇文章,我无法在该主题中回复。 我在接受的职位上遇到的问题是,似乎有一些angular落案件影响了我正在做的一些工作,所以我做了一些改变,试图掩盖我遇到的问题。

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

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

 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]'

编辑:我已经改变了代码,以反映数组的一般性testing,或者你可以使用jquery $.isArray或原型Object.isArray

我的第二个问题是负hex整数文字string(“-0xA” – > -10)不计算为数字。 但是,正数hex整数string(“0xA” – > 10)将被视为数字。 我需要两个是有效的数字。

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

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

如果您担心每次调用函数时都会创build正则expression式,那么您可以在闭包中重写它,像这样

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

然后我拿了CMS + 30testing用例,并克隆了jsfiddle上的testing,添加了我的额外testing用例和我上面描述的解决scheme。

一切似乎按预期工作,我没有遇到任何问题。 有什么问题,代码或理论,你可以看到?

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

编辑 :正如Bergi指出的,还有其他可能的对象,可以被认为是数字,它会比黑名单更好的白名单。 考虑到这一点,我会添加到标准。

我想我的数字函数只考虑数字或string

考虑到这一点,最好使用它

 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(/^-/, '')); } 

这已被添加为testing22

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

例如{toString:function(){return "1.2";}}也可以有任何其他对象的问题。 你认为哪些对象是数字? Number对象? 没有?

你不应该试图将某些不合格的东西列入黑名单,而应该明确地将你想要的数字列入白名单。 你应该得到什么函数,原始string和数字? 然后为他们准确地testing:

 (typeof n == "string" || typeof n == "number") 

如果你可以使用正则expression式,这可能会有诀窍:

 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())); } 

编辑:修正了hex数字的问题

如果AMD听起来不错,那么看看mout的isNumber() 。

 function isNumber(value){return typeof value == 'number';} 

怎么样:

 function isNumber(value) { value = Number(value); return typeof value === 'number' && !isNaN(value) && isFinite(value); } 

isNaN函数用于检查数值是否为数字。 如果值是数字,则返回true,否则返回false。

码:

  <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]'; } 
Interesting Posts