2015-12-01 96 views
0

我想要一串数字和字符并将数字相加。在字符串中添加数字

例如:“2015年,我想知道iPhone 6+的价格是多少?”

输出:2021

这里是我当前的代码:

var str = "In 2015, I want to know how much does iPhone 6+ cost?"; 

function sumFromString(str){ 
    var punctuationless = str.replace(/['!"#$%&\\'()\*+,\-\.\/:;<=>[email protected]\[\\\]\^_`{|}~']/g,""); 
    var finalString = punctuationless.replace(/\s{2,}/g," "); 
    var StringList = finalString.split(" "); 
    var sum = []; 
    for (i = 0; i < StringList.length; i++) 
    if (isInt(StringList[i]) 
     sum.add(StringList[i]); 
    sum.reduce((prev, curr) => prev + curr); 
} 
sumFromString(str); 

我的代码将一个字符串条标点符号的,然后每个单词/数字放入数组,StringList的。

我不能得到下一部分的工作。

我试过的是迭代数组中的每个值。 if语句应该检查数组元素是否是整数。如果是这样,它会将整数添加到名为sum的空数组中。然后,我将数组的所有值,sum加起来。

+0

为什么不直接搜索所有数字的字符串? – miken32

+0

当您添加时,您是否将它转换为数字? 'sum.add(+ StringList [i])' –

+2

'var matches = str.match(/ \ d +/g); var sum = matches.reduce((prev,curr)=> prev + curr);' – miken32

回答

3

简单多了:

function sumFromString(str) { 
    return (str.match(/\d+/g)||[]).reduce((p,c)=>+c+p); 
} 

请特别注意,我用+c+p - +c从串的电流值转换为一数,然后将它添加到p。这匹配了字符串中的所有数字 - 如果没有空数组,则会获得一个空数组,并减少该数组。

0

使用split函数将字符串拆分为所有字符的数组,然后运行filter函数获取所有数字。使用map函数遍历所有包含数字的元素,并从中删除非数字的字符。

然后用reduce得到所有数字的总和。由于我们在这里处理字符串,我们必须执行type conversion将它们转换为数字。

string.split(' ').filter(function(word) { 
    return /\d+/.test(word) } 
}).map(function(s) { 
    return s.replace(/\D/, '') 
}).reduce(function(a,b) { 
    return Number(a) + Number(b); 
}); 
1

对于各种各样的缘故,这里有一个办法做到这一点没有正则表达式:

var myString = "5 bunnies ate 6 carrots in 2days."; 
var myArray = myString.split(''); 
var total = 0; 
for (var i = 0; i < myArray.length; i++) { 
    if (!isNaN(parseInt(myArray[i]))) { 
    total += parseInt(myArray[i]); 
    } 
} 

Fiddle Demo

注:如果有机会的myString可能是零,你会希望在分割前添加检查。