在javascript中编写findNumbersInStr函数

时间:2014-02-25 19:20:02

标签: javascript

我想在javascript中编写一个函数,它接受一个由空格分隔的数字串,并返回一个只包含字符串AS NUMBERS(不是字符串)中的数字的数组。

我的代码如下:

function findNumbersInStr(strToParse) 

{
    var numbers = new Array();

    if( typeof strToParse !== 'string'){
    return 'undefined';
}
else{
    var arrayNumbers = strToParse.split(" ");

    for (i=0; i < arrayNumbers.length; i++)
    {
        ele = parseInt(arrayNumbers[i]);
        if (typeof ele === "number")
        {
            console.log("this is the " + i + "th loop!");
            var temp = parseInt(arrayNumbers[i]);
            numbers.push(temp);
        }
    } 
}
return numbers; 
}

但是当我这样调用函数时:

console.log(findNumbersInStr("8 24 what hahaha 3990"));

我得到了结果:[8, 24, NaN, NaN, 3990] 它似乎认为NaN是一种数字。 我怎么能解决这个问题?

提前谢谢!

8 个答案:

答案 0 :(得分:1)

通过使用如下正则表达式,您可以使用更简单的函数:

var findNumbersInStr = function(str){

    if( typeof str !== 'string' ) return;

    return str.match(/(\d+)/g).map(Number)
}

findNumbersInStr("8 24 what hahaha 3990"); // [8, 24, 3990]

Demo

答案 1 :(得分:1)

function findNumbersInStr(strToParse) {  
    var matches = strToParse.match(/\d+/g), numbers = [];
    matches.forEach(function(number){
        numbers.push(parseInt(number, 10));
    });
    return numbers;
}

希望这会有所帮助,您的功能可能如上所示。 JSFiddle

答案 2 :(得分:0)

    ele = parseInt(arrayNumbers[i]);
    if (typeof ele === "number")

typeof NaN == "number",因此测试无效 - parseInt如果失败则不会返回非数字类型。相反,使用

    if (!isNaN(ele))

答案 3 :(得分:0)

var numbers = [];
var string = "8 24 what hahaha 3990";

var parts = string.split(" ");
for(i = 0; i < parts.length; i++) {
    var number = parseInt(parts[i]);
    if(!isNaN(number)) numbers.push(number);
}

// numbers => [8, 24, 3990]

答案 4 :(得分:0)

使用ES5,很容易:

"8 24 what hahaha 3990"
    .split(/ +/)                               // Split into array
    .map(function(i){return +i;})              // Convert to numbers
    .filter(function(i){return !isNaN(i);})    // Remove NaNs

使用ES6,它甚至更好:

"8 24 what hahaha 3990"
    .split(/ +/)               // Split into array
    .map(i => +i)              // Convert to numbers
    .filter(i => !isNaN(i))    // Remove NaNs

(注意ES6浏览器支持可以忽略不计)

答案 5 :(得分:0)

这是我的版本:

(string.match(/[0-9]+/g) || []).map(Number)

你会获得所有数字,只有数字。

如果您还想验证输入是否为字符串,则可以执行此操作,尽管对于单行程序来说可能过于复杂:

((typeof string == 'string' && string.match(/[0-9]+/g)) || []).map(Number)

答案 6 :(得分:0)

有小数点和减号的有效数字,以及e(1.2345e10):

function matchNumbers(str){
    var ns= str.match(/-?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?/g) || []
    return ns.map(Number);
}
var s= "8 24 what hahaha 3990";
matchNumbers(s)

/ *返回值:(数组) 8,24,3990 * /

答案 7 :(得分:0)

您的代码存在的问题是,parseInt(nonNumericString)将评估为NaN,当与typeof一起使用时,评估为......惊讶... number。请尝试使用正则表达式:

var strToParse = "12 2 hello 32 dog 366 cat";
var splitStringArray = strToParse.split(" ");
var storedNumbers = [];
var reg = new RegExp('^\\d+$');

for (i = 0; i < splitStringArray.length; i++) {
    var elem = splitStringArray[i];
    if (reg.test(elem)) {
        storedNumbers.push(elem);
    }
}
alert(storedNumbers);