JavaScript中的(内置)方式来检查字符串是否为有效数字

JavaScript

JimDavaid卡卡西

2020-03-09

我希望与旧的VB6 IsNumeric()函数在同一概念空间中存在某些东西吗?

第344篇《JavaScript中的(内置)方式来检查字符串是否为有效数字》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

13个回答
古一番长小小 2020.03.09

You could make use of types, like with the flow library, to get static, compile time checking. Of course not terribly useful for user input.

// @flow

function acceptsNumber(value: number) {
  // ...
}

acceptsNumber(42);       // Works!
acceptsNumber(3.14);     // Works!
acceptsNumber(NaN);      // Works!
acceptsNumber(Infinity); // Works!
acceptsNumber("foo");    // Error!
Gil小哥伽罗 2020.03.09

Just use isNaN(), this will convert the string to a number and if get a valid number, will return false...

isNaN("Alireza"); //return true
isNaN("123"); //return false
Near逆天 2020.03.09

My solution:

// returns true for positive ints; 
// no scientific notation, hexadecimals or floating point dots

var isPositiveInt = function(str) { 
   var result = true, chr;
   for (var i = 0, n = str.length; i < n; i++) {
       chr = str.charAt(i);
       if ((chr < "0" || chr > "9") && chr != ",") { //not digit or thousands separator
         result = false;
         break;
       };
       if (i == 0 && (chr == "0" || chr == ",")) {  //should not start with 0 or ,
         result = false;
         break;
       };
   };
   return result;
 };

You can add additional conditions inside the loop, to fit you particular needs.

梅路易 2020.03.09

PFB the working solution:

 function(check){ 
    check = check + "";
    var isNumber =   check.trim().length>0? !isNaN(check):false;
    return isNumber;
    }
斯丁JinJinHarry 2020.03.09

对于TypeScript无效,因为:

declare function isNaN(number: number): boolean;

对于TypeScript,您可以使用:

/^\d+$/.test(key)

Green小卤蛋 2020.03.09

好吧,我正在使用我制作的这个...

到目前为止,它一直在工作:

function checkNumber(value) {
    if ( value % 1 == 0 )
    return true;
    else
    return false;
}

如果您发现任何问题,请告诉我。

Tony达蒙Mandy 2020.03.09

为什么jQuery的实现不够好?

function isNumeric(a) {
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0;
};

迈克尔提出了类似的建议(尽管我在这里偷了“ user1691651-约翰”的变更版):

function isNumeric(num){
    num = "" + num; //coerce num to be a string
    return !isNaN(num) && !isNaN(parseFloat(num));
}

以下是最有可能性能较差但结果稳定的解决方案。这是jQuery 1.12.4实现和Michael的回答的矛盾之处,需要额外检查前导/后缀空格(因为Michael的版本对于前导/后缀空格的数字返回true):

function isNumeric(a) {
    var str = a + "";
    var b = a && a.toString();
    return !$.isArray(a) && b - parseFloat(b) + 1 >= 0 &&
           !/^\s+|\s+$/g.test(str) &&
           !isNaN(str) && !isNaN(parseFloat(str));
};

不过,后一个版本具有两个新变量。通过执行以下操作,可以绕开其中之一:

function isNumeric(a) {
    if ($.isArray(a)) return false;
    var b = a && a.toString();
    a = a + "";
    return b - parseFloat(b) + 1 >= 0 &&
            !/^\s+|\s+$/g.test(a) &&
            !isNaN(a) && !isNaN(parseFloat(a));
};

除了手动测试我当前困境中遇到的几个用例之外,我还没有通过其他方法对其中的任何一个进行过测试,而这些都是非常标准的东西。这是“站在巨人的肩膀上”的情况。

神奇古一 2020.03.09

引用:

isNaN(num)//如果变量不包含有效数字,则返回true

如果您需要检查前导/尾随空格(例如,当需要一定数量的数字时),并且需要输入例如“ 1111”而不是“ 111”或“ 111”,则并不完全正确输入。

更好地使用:

var num = /^\d+$/.test(num)
阿飞GilGreen 2020.03.09

parseInt(),但是请注意,此函数在某种意义上有所不同,例如对于parseInt(“ 100px”)返回100。

LEY神无 2020.03.09

我已经测试过,迈克尔的解决方案是最好的。投票给他上面的答案(在该页面上搜索“如果您确实要确保该字符串”以找到它)。本质上,他的答案是这样的:

function isNumeric(num){
  num = "" + num; //coerce num to be a string
  return !isNaN(num) && !isNaN(parseFloat(num));
}

它适用于每个测试用例,我在这里记录了这些内容:https : //jsfiddle.net/wggehvp9/5/

对于这些边缘情况,许多其他解决方案均失败:'',null,“”,true和[]。从理论上讲,您可以通过适当的错误处理来使用它们,例如:

return !isNaN(num);

要么

return (+num === +num);

对/ \ s /,null,“”,true,false,[](还有其他?)进行特殊处理

泡芙Sam 2020.03.09

尝试isNan函数

isNaN()函数确定一个值是否为非法数字(非数字)。

如果该值等于NaN,则此函数返回true。否则,它返回false。

此函数不同于Number特定Number.isNaN()方法。

  全局isNaN()函数,将测试的值转换为Number,然后对其进行测试。

Number.isNan()不会将值转换为Number,并且对于任何非Number类型的值也不会返回true。

小卤蛋村村 2020.03.09

如果你真的想确保字符串只包含一个数字,任何数字(整数或浮点数),并准确一些,你不能使用parseInt()/ parseFloat()Number()!isNaN()自己。请注意,!isNaN()实际上是true在什么时候Number()会返回数字,false什么时候会返回NaN,所以我将在其余的讨论中将其排除在外。

的问题parseFloat()是,它会返回一个数字,如果字符串中包含任何数量,即使字符串不包含准确的数字:

parseFloat("2016-12-31")  // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2

问题Number()在于,如果传递的值根本不是数字,它将返回一个数字!

Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0   \t\n\r") // returns 0

滚动自己的正则表达式的问题在于,除非您创建了与浮点数匹配的确切正则表达式,否则Javascript会识别该正则表达式,否则您会错过某些情况,或者会发现一些本不应该的情况。即使您可以使用自己的正则表达式,为什么呢?有更简单的内置方法。

但是,事实证明Number()(和isNaN())在每种情况下parseFloat()都应该做正确的事情,在这种情况下,本不应该返回数字,反之亦然。因此,要确定一个字符串是否确实是唯一且仅是一个数字,请调用这两个函数并查看它们是否返回true:

function isNumber(str) {
  if (typeof str != "string") return false // we only process strings!
  // could also coerce to string: str = ""+str
  return !isNaN(str) && !isNaN(parseFloat(str))
}
Ss Yy 2020.03.09

您可以使用RegExp方式:

var num = "987238";

if(num.match(/^-{0,1}\d+$/)){
  //valid integer (positive or negative)
}else if(num.match(/^\d+\.\d+$/)){
  //valid float
}else{
  //not valid number
}

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android