Nodejs 计算字符串中所有数字之和

Nodejs 计算字符串中所有数字之和

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

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

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


14 回复

当然可以!我们可以使用 Node.js 来计算字符串中所有数字(包括整数和小数)的总和。下面是具体的实现步骤和代码示例。

实现步骤

  1. 匹配字符串中的所有数字:我们需要匹配出字符串中的所有数字,包括整数和小数。
  2. 转换为数值并求和:将匹配到的数字字符串转换为数值,并进行累加求和。

示例代码

function sumOfNumbersInString(str) {
    // 使用正则表达式匹配字符串中的所有数字(包括整数和小数)
    const matches = str.match(/-?\d+(\.\d+)?/g);
    
    // 如果没有匹配到任何数字,则返回 0
    if (!matches) return 0;
    
    // 将匹配到的数字字符串转换为数值,并进行累加求和
    const sum = matches.reduce((acc, numStr) => acc + parseFloat(numStr), 0);
    
    return sum;
}

// 测试示例
const input = '你好吗17这里是cnode34.5你知道nodejs67.23吗';
const result = sumOfNumbersInString(input);

console.log(result); // 输出:118.73

解释

  1. 匹配数字

    • str.match(/-?\d+(\.\d+)?/g):这个正则表达式用于匹配字符串中的所有数字,包括负数、整数和小数。
      • -?:表示可选的负号。
      • \d+:表示一个或多个数字。
      • (\.\d+)?:表示一个可选的小数部分,由一个小数点和一个或多个数字组成。
  2. 转换并求和

    • matches.reduce((acc, numStr) => acc + parseFloat(numStr), 0):使用 reduce 方法对匹配到的数字字符串数组进行累加求和。
      • parseFloat(numStr):将数字字符串转换为浮点数。
      • acc 是累加器,初始值为 0

通过上述步骤和代码,我们能够准确地提取字符串中的所有数字并计算它们的总和。希望这对你有帮助!


最笨的方法就是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

要计算字符串中所有数字(包括整数和小数)之和,可以使用正则表达式来匹配这些数字,并将它们转换为数值进行累加。

下面是一个示例代码:

function sumNumbersInString(str) {
    // 使用正则表达式匹配字符串中的所有数字,包括整数和小数
    const numbers = str.match(/-?\d+(\.\d+)?/g);
    
    // 如果没有找到任何数字,则返回0
    if (!numbers) return 0;

    // 将找到的数字转换为浮点数并求和
    return numbers.reduce((sum, num) => sum + parseFloat(num), 0);
}

const str = '你好吗17这里是cnode34.5你知道nodejs67.23吗';
console.log(sumNumbersInString(str)); // 输出: 118.73

解释

  1. 正则表达式/-?\d+(\.\d+)?/g

    • -?:允许负数。
    • \d+:匹配一个或多个数字。
    • (\.\d+)?:可选的小数部分。
    • g:全局搜索标志,确保匹配字符串中的所有符合条件的部分。
  2. match() 方法:用于查找字符串中所有匹配给定正则表达式的子串,并以数组形式返回。

  3. reduce() 方法:将数组中的元素通过一个函数累加到单个输出值。

示例代码说明

  • 函数 sumNumbersInString 接受一个字符串作为输入。
  • 使用 match() 方法查找字符串中的所有数字。
  • 如果没有找到数字,则返回 0
  • 使用 reduce() 方法将找到的数字转换为浮点数并累加求和。

这样,我们就能得到字符串中所有数字(包括整数和小数)的总和。

回到顶部