Nodejs 计算字符串中所有数字之和
Nodejs 计算字符串中所有数字之和
在开发中遇到一个问题,有一串字符串里面包含数字,比如:‘你好吗17这里是cnode34.5你知道nodejs67.23吗’
。怎么提取这里面的所有数字出来并且求和?这里所说的数字之和是值:17+34.5+67.23
,不是每个单个数字之和!网上的方法只是提取说有的数字:
var openIndex = openingId.replace(/[^0-9]/ig,"");
而且他会把小数点也替换掉了!大家有没有其他办法啊?或者说是其他的思路?恳请各位大神帮帮忙啊。
当然可以!我们可以使用 Node.js 来计算字符串中所有数字(包括整数和小数)的总和。下面是具体的实现步骤和代码示例。
实现步骤
- 匹配字符串中的所有数字:我们需要匹配出字符串中的所有数字,包括整数和小数。
- 转换为数值并求和:将匹配到的数字字符串转换为数值,并进行累加求和。
示例代码
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
解释
-
匹配数字:
str.match(/-?\d+(\.\d+)?/g)
:这个正则表达式用于匹配字符串中的所有数字,包括负数、整数和小数。-?
:表示可选的负号。\d+
:表示一个或多个数字。(\.\d+)?
:表示一个可选的小数部分,由一个小数点和一个或多个数字组成。
-
转换并求和:
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);
低调的奢华,
我只是想到了用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
解释
-
正则表达式:
/-?\d+(\.\d+)?/g
-?
:允许负数。\d+
:匹配一个或多个数字。(\.\d+)?
:可选的小数部分。g
:全局搜索标志,确保匹配字符串中的所有符合条件的部分。
-
match() 方法:用于查找字符串中所有匹配给定正则表达式的子串,并以数组形式返回。
-
reduce() 方法:将数组中的元素通过一个函数累加到单个输出值。
示例代码说明
- 函数
sumNumbersInString
接受一个字符串作为输入。 - 使用
match()
方法查找字符串中的所有数字。 - 如果没有找到数字,则返回
0
。 - 使用
reduce()
方法将找到的数字转换为浮点数并累加求和。
这样,我们就能得到字符串中所有数字(包括整数和小数)的总和。