计算字符串中所有数字之和
发布于 10 年前 作者 xiuxu123 8160 次浏览 最后一次编辑是 8 年前

在开发中遇到一个问题,有一串字符串里面包含数字,比如:'你好吗17这里是cnode34.5你知道nodejs67.23吗'。怎么提取这里面的所有数字出来并且求和?这里所说的数字之和是值:17+34.5+67.23,不是每个单个数字之和!网上的方法只是提取说有的数字:

var openIndex = openingId.replace(/[^0-9]/ig,"");  

而且他会把小数点也替换掉了!大家有没有其他办法啊?或者说是其他的思路?恳请各位大神帮帮忙啊。

12 回复

最笨的方法就是for把所有数字提出来

var lastnum = false;
var dotted = false;
var nums = [];
for(var i = 0; i < text.length(); i++)
{
    if(text[i] >= '0' && text[i] <= '9') {
        if(!lastnum) {
            lastnum = true;
            nums.push[text[i]];
        } else {
            nums[nums.length - 1] += text[i];
        }
    } else if(text[i] === '.') {
        if(lastnum && !dotted) {
            nums[nums.length - 1] += text[i];
            dotted = true;
        } else {
            lastnum = false;
            dotted = false;
        }
    } else {
        lastnum = false;
        dotted = false;
    }
}

直接在编辑框里码的,不保证正确性-。 -

反正大致就是这个样子吧。最后把数组里的数字都加起来就好了。

[0-9.]+ 正则匹配出来啊

process.stdin.resume();
process.stdin.setEncoding('utf8');
var s = '你好吗17这里是cnode34.5你知道nodejs67.23吗';
var reg = /[+-]?\d+\.?\d*/g;
var sum = 0.0;
var expr;
numbers = s.match(reg);
if (numbers != null){
    for (v in numbers) {
        if (v == 0)
            expr = numbers[v];
        else
            expr += '+' + numbers[v];
        sum += parseFloat(numbers[v]);
    }    
}
console.log(expr + '=' + sum);

http://ideone.com/daflJt

低调的奢华,

我只是想到了用String对象的match,因为他可以匹配后返回数组,但是一直写不出来正则!谢谢您!

看了下您的资料,低调有内涵!

不错,不错,漫画爱好者

这样算不偷懒?

function fun(src){
    var n = 0;
    src.replace(/[\d\.]+/g,function(s){var _n = parseFloat(s); if (_n == _n){n+=_n}})
    return n;
}

正则有BUG还出来打广告

var s = "sdsdsf21dssds4.52ssccx";
var result = s.match(/\d+\.?\d*/gi)
             .reduce(function(p,c){return parseFloat(p)+parseFloat(c)});

// result is 25.52

签名 《Node.js 服务器框架开发实战》 http://url.cn/Pn07N3

这个不行,有BUG! var s = “sds1.2sdf,1…sdf…1,…1…1.1,.1ssccx”; 结果不一致

真是惭愧啊,我也就是想到match()却没有想到使用数组的reduce(),看似多使用一个方法,功力却相差很多,真是惭愧!

reduce开销有点大,但是这么写比较jsstyle

回到顶部