JavaScript从字符串中解析整数

3
我想做的是确定字符串是否为数字。我想知道人们对我正在决定使用的两种解决方案的想法(或者是否有更好的解决方案我还没有找到)。parseInt函数不适合,因为对于像“40岁”的参数它会返回一个整数值。我正在考虑使用以下两种解决方案之一:
1. 使用带有try catch的Integer.valueOf()函数 2. 使用正则表达式
function isNumeric(quantity)
{
    var isNumeric = true
    try
    {
        Integer.valueOf(quantity)
    }
    catch(err)
    {
        isNumeric = false
    }
    return isNumeric
}

或逐个检查每个字符

function IsNumeric(quantity)
{
    var validChars = "0123456789";
    var isNumber = true;
    var nextChar;

    for (i = 0; i < quantity.length && isNumber == true; i++) 
    { 
        nexChar = quantity.charAt(i); 
        if (validChars.indexOf(nextChar) == -1) 
        {
            isNumber = false;
        }
    }
    return IsNumber;
}

我认为应该有比这两种方法更简单的解决方案,难道我错过了什么吗?

注意:我也在使用jQuery,如果有jQuery的解决方案那就足够了。


字符串可以包含前导符号字符(+-)吗? - David R Tribble
是的,字符串可以是任何内容。 - Simon Fox
如果使用 if (nexChar >= '0' && nexchar <= '9') 比使用 indexOf() 更高效。 - David R Tribble
1
虽然与indexOf的O(n)相比,Loadmaster的测试时间是恒定的(在大多数实现中),但它确实依赖于数字字符在字符集中的密集程度。(也就是说,表示“1”的字符符号比'0'高一个,依此类推。)值得庆幸的是,所有流行的字符集(包括ECMAscript指定的字符集甚至EBCDIC)都具有这种属性。 - Berry
7个回答

12

我曾经需要实现类似于你所要求的功能,但需要验证变量是否包含数字并且不知道其类型,它可能是数字字符串(考虑指数记数等),Number对象或基本上任何东西。

而且我需要注意隐式类型转换,例如!isNaN(true) == true是不好的。

最终,我编写了30多个单元测试,您可以在这里找到它们,并使用以下函数,该函数通过了我所有的测试:

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

7
为什么不使用isNaN(obj)呢?
function IsNumeric (value) {
    return (!((isNaN(value)) || (value.length == 0)));
}

它也会失败,包括空格字符:IsNumeric(' ') == true;IsNumeric('\t \t') == true; - Christian C. Salvadó

4
怎么样使用正则表达式?
function IsNumeric(string) { 
    return string.match(/^\d+$/) !== null;
}

(未经测试或非常保守,但你明白要点)

1
如果传入的值不是字符串,或者更糟糕的是 null,那么这将会出错。 - mimetnet
我会修改正则表达式以允许前导符号字符:/^[-+]?\d+$/ - David R Tribble

1

如果你只是在测试字符串,为什么不让任何字符串都可以使用这个方法呢?

String.prototype.isNumeric= function(){
 return parseFloat(this)== this;
}

1

这对大多数值都适用。

function isNumericString(s)
{
   return !!s && !isNaN(+s);
}

通常使用一元加号是将字符串转换为数字的最佳方式。没有进制问题,也不会出现悬挂的非数字问题。


如果使用空格字符字符串,将会失败,例如 isNumericString('\t \t') == true; 或者 isNumericString(' ') == true; - Christian C. Salvadó

0

这是我的解决方案,使用parseInt函数可以实现:

var str = "40 years old";
var isNumeric = parseInt(str) == str ? true : false;

0

我想你可以使用正则表达式来验证输入,但是我真的不明白第一个方法有什么问题。


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