我想在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是一种数字。
我怎么能解决这个问题?
提前谢谢!
答案 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]
答案 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);