在某些项目中,我需要验证一些数据并尽可能确定它是可以在数学运算中使用的javascript数值。
jQuery和其他一些javascript库已经包含了这样一个函数,通常称为isNumeric。还有一个post on 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]'
编辑:我已更改代码以反映数组的通用测试,或者您可以使用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 test cases并克隆了testing on jsfiddle添加了我的额外测试用例和上述解决方案。
一切似乎都按预期工作,我没有遇到任何问题。您可以看到任何问题,代码或理论吗?
它可能无法取代广泛接受/使用的答案,但如果这是您希望的isNumeric函数的结果,那么希望这会有所帮助。
编辑:正如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
答案 0 :(得分:4)
在我看来,如果它是一个数组,那么它不是数字。为了缓解这个问题,我在逻辑
中添加了对折扣数组的检查
您也可以将此问题与任何其他对象一起使用,例如{toString:function(){return "1.2";}}
。您认为哪些对象是数字的? Number
个对象?无?
您应该明确地将您想要成为数字的内容列入白名单,而不是尝试将某些未通过测试的内容列入黑名单。你的功能应该是什么,原始字符串和数字?然后完全测试它们:
(typeof n == "string" || typeof n == "number")
答案 1 :(得分:1)
如果你可以使用正则表达式,这可能就是这个诀窍:
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()));
}
编辑:修复了十六进制数的问题
答案 2 :(得分:0)
function isNumber(value){return typeof value == 'number';}
答案 3 :(得分:0)
如果AND听起来不错,请查看mout's isNumber()。
答案 4 :(得分:0)
怎么样:
function isNumber(value) {
value = Number(value);
return typeof value === 'number' && !isNaN(value) && isFinite(value);
}
答案 5 :(得分:0)
isNaN函数用于检查值是否为数字。如果值是数字,则返回true,否则返回false。
代码:
<script>
function IsNumeric(val) {
if (isNaN(parseFloat(val))) {
return false;
}
return true
}
bool IsNumeric(string);
</script>
答案 6 :(得分:0)
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]';
}