一种改进的ISNUMERIC()函数?(An improved isNumeric() functi

2019-08-17 03:22发布

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

jQuery和其他一些JavaScript库已经包括了这样的功能,通常被称为ISNUMERIC。 还有一个对计算器后已作为回答,大致相同的例程中脱颖而出提到库是使用被广泛接受。

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)wrere视为数字。 我需要既要有效的数值。

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

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测试用例和克隆上的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

Answer 1:

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

可以与任何其他对象的问题,以及,例如{toString:function(){return "1.2";}} 你认为哪个对象被数字? Number的对象? 没有?

而不是试图黑名单一些事情,失败的测试,你应该明确地列入白名单,你想成为数字的东西。 你有什么功能应该得到的,原始的字符串和数字? 然后测试正好为他们:

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


Answer 2:

如果这是确定你使用正则表达式,这可能做的伎俩:

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

编辑:固定的问题与十六进制数



Answer 3:

如果AMD听起来好给你,看看MOUT的ISNUMBER() 。



Answer 4:

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


Answer 5:

怎么样:

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


Answer 6:

用于检查值isNaN函数是一个数值或没有。 如果值是数字,它的返回TRUE,否则返回false。

码:

 <script>

         function IsNumeric(val) {

              if (isNaN(parseFloat(val))) {

                 return false;

          }

          return true

  }


  bool IsNumeric(string);


</script>


Answer 7:

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


文章来源: An improved isNumeric() function?