如何检查一个字符串是否是有效的数字?

1911

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


5
请参考我之前提出的相关问题此链接 - Michael Haren
55
如果您查看这个问题,请尽量跳过所有正则表达式的答案。那不是解决问题的正确方式。 - Joel Coehoorn
18
除非有人想要做这件事:检查给定字符串是否具有有效数字流的格式。那么为什么这样做是错的呢? - SasQ
41
选定的答案是不正确的!!!请查看其评论,但基本上它在例如isNaN("")isNaN(" ")isNaN(false)等情况下失败了。它返回false,这意味着它们是数字。 - Andrew
11
所选答案是不正确的,正则表达式也不能解决这个问题。那么正确的方法是什么? - vir us
显示剩余3条评论
53个回答

0

我在Angular中使用了这个函数

 isNumeric(value: string): boolean {
             let valueToNumber = Number(value);
             var result = typeof valueToNumber == 'number' ;
             if(valueToNumber.toString() == 'NaN')
             {
                result = false;
             }
             return result;
          }

以下是翻译的文本:const isNumeric = (value: string) => !(Number(value).toString() == 'NaN');这段代码有什么问题吗? - Florin Mircea

0

我的解决方案:

// 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;
 };

你可以在循环内添加附加条件,以满足你的特定需求。


0
在我的应用程序中,我们只允许使用a-z、A-Z和0-9字符。我发现上面的答案使用“string % 1 === 0”是有效的,除非字符串以0xnn(如0x10)开头,否则它会将其作为数字返回,而我们不希望它这样做。在我们特定的情况下,以下简单的陷阱似乎能解决我们的数字检查问题。
function isStringNumeric(str_input){   
    //concat a temporary 1 during the modulus to keep a beginning hex switch combination from messing us up   
    //very simple and as long as special characters (non a-z A-Z 0-9) are trapped it is fine   
    return '1'.concat(str_input) % 1 === 0;}

警告:这可能是利用Javascript和Actionscript中长期存在的一个漏洞 [Number("1" + the_string) % 1 === 0],我不能确定,但这正是我们所需要的。


为什么这会是 JavaScript 中的一个 bug? - Bergi
我在perl或C中使用类似的解决方案时,并没有看到相同的行为。由于我不是javascript或actionscript的编程语言开发人员,我不知道我正在经历的行为是否真正是有意的。 - rwheadon
JavaScript 在隐式类型转换方面有些松散,但一旦你知道了这一点,就可以很容易地理解它的工作原理。你正在将字符串转换为数字(通过对它们调用数值 % 1 操作),这将把字符串解释为十六进制或浮点字面量。 - Bergi

0

我尝试了一个有点混乱的解决方案,也许不是最好的选择。

function isInt(a){
    return a === ""+~~a
}


console.log(isInt('abcd'));         // false
console.log(isInt('123a'));         // false
console.log(isInt('1'));            // true
console.log(isInt('0'));            // true
console.log(isInt('-0'));           // false
console.log(isInt('01'));           // false
console.log(isInt('10'));           // true
console.log(isInt('-1234567890'));  // true
console.log(isInt(1234));           // false
console.log(isInt('123.4'));        // false
console.log(isInt(''));             // false

// other types then string returns false
console.log(isInt(5));              // false
console.log(isInt(undefined));      // false
console.log(isInt(null));           // false
console.log(isInt('0x1'));          // false
console.log(isInt(Infinity));       // false

这并不太糟糕,但它无法处理任何非十进制表示法,例如(1)科学计数法和(2)非十进制表示法,例如八进制(042)和十六进制(0x45f)。 - Domi
这并没有回答寻找数值的问题,它只是寻找整数。 - Jeremy

0
这是一个高性能(在3.8GHz Haswell上为2.5 * 10 ^ 7次迭代/秒)的isNumber实现版本。它适用于我能找到的每个测试用例(包括符号):
var isNumber = (function () {
  var isIntegerTest = /^\d+$/;
  var isDigitArray = [!0, !0, !0, !0, !0, !0, !0, !0, !0, !0];
  function hasLeading0s (s) {
    return !(typeof s !== 'string' ||
    s.length < 2 ||
    s[0] !== '0' ||
    !isDigitArray[s[1]] ||
    isIntegerTest.test(s));
  }
  var isWhiteSpaceTest = /\s/;
  return function isNumber (s) {
    var t = typeof s;
    var n;
    if (t === 'number') {
      return (s <= 0) || (s > 0);
    } else if (t === 'string') {
      n = +s;
      return !((!(n <= 0) && !(n > 0)) || n === '0' || hasLeading0s(s) || !(n !== 0 || !(s === '' || isWhiteSpaceTest.test(s))));
    } else if (t === 'object') {
      return !(!(s instanceof Number) || ((n = +s), !(n <= 0) && !(n > 0)));
    }
    return false;
  };
})();

0

判断一个字符串或者数字是否为数字

const isNumeric = stringOrNumber =>
  stringOrNumber == 0 || !!+stringOrNumber;

或者,如果您想将字符串或数字转换为数字

const toNumber = stringOrNumber =>
  stringOrNumber == 0 || +stringOrNumber ? +stringOrNumber : NaN;

0

我不喜欢提供的解决方案,因为我只需要数字。

nums = new Set(['1','2','3','4','5','6','7','8','9','0']);
hasOnlyNumbers= str =>[...str].every( x=>nums.has(x) );

https://jsfiddle.net/gaby_de_wilde/05fb7k3g/

如果你想允许负数(忽略字符串开头的负号)

nums = new Set(['1','2','3','4','5','6','7','8','9','0']);
hasOnlyNumbers=str=>[...str[0]=='-'?str.substring(1):str].every(x=>nums.has(x));

https://jsfiddle.net/gaby_de_wilde/y4fdwvxk/

如果您想让它更易读:
nums = new Set(['1','2','3','4','5','6','7','8','9','0']);
hasOnlyNumbers = function(str){
  if(str[0]=='-'){ 
    str = str.substring(1) 
  }
  return [...str].every(x=>nums.has(x));
}

https://jsfiddle.net/gaby_de_wilde/6a5qwx2t/

允许一个小数点(最多允许1个)

nums = new Set(['.','1','2','3','4','5','6','7','8','9','0']);
hasOnlyNumbers=str=>str.split('.').length<3&&[...str[0]=='-'?str.substring(1):str].every(x=>nums.has(x));

https://jsfiddle.net/gaby_de_wilde/hnx8d6so/

更易读:

nums = new Set(['.','1','2','3','4','5','6','7','8','9','0']);
hasOnlyNumbers = function(str){
  if(str.split('.').length > 2) { 
    return false 
  }
  if(str[0]=='-'){ 
    str = str.substring(1) 
  }
  return [...str].every(x=>nums.has(x));
}

https://jsfiddle.net/gaby_de_wilde/sz7e95mw/

注意:现在集合也有一个点。

-1

只需使用isNaN(),它会将字符串转换为一个数字,如果获得一个有效的数字,就会返回false...

isNaN("Alireza"); //return true
isNaN("123"); //return false

-1
如果您正在寻找正数(例如房屋号码),只需使用以下代码:
if (mystring > 0) ...

-1
我正在使用以下内容:
const isNumber = s => !isNaN(+s)

1
在许多情况下,它的工作相对良好,但在像 1..11,1-32.1.12 等情况下会失败,更重要的是,它无法处理 undefinedNaN。如果你传递了 undefinedNaN,它会返回一个错误的结果,说它是一个数字。 - Jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接