您可以将字符串拆分(或展开)为单个字符,将它们强制转换为数字并将它们相加。因为这Array#reduce可能是一个自然的选择:
[...'145'].reduce((sum, n) => sum + Number(n), 0)
//=> 10
但这不会解释字符串中的负数:
[...'-145'].reduce((sum, n) => sum + Number(n), 0)
//=> NaN
假设结果应该是-1 + 4 + 5 = 8,那么我们需要将减号与其所属的数字保持一致:
'-145'.match(/(\-?\d)/g).reduce((sum, n) => sum + Number(n), 0)
//=> 8
如果你有小数怎么办?您需要将签名后的所有数字放在一起。.幸运的是,我们可以稍微调整一下上面的正则表达式:
'-145.08'.match(/(\-?\d|\.\d+)/g)
//=> ['-1', '4', '5', '.08']
不用担心.08它会很好地转换:Number('.08') //=> 0.08
有了所有这些知识,我们可以构建sum_str如下:
const sum_str = str => str.match(/(\-?\d|\.\d+)/g).reduce((sum, n) => sum + Number(n), 0);
sum_str('145');
//=> 10
sum_str('-145');
//=> 8
sum_str('-145.08');
//=> 8.08