四舍五入字符串中的所有数字

时间:2019-10-12 11:46:15

标签: javascript typescript

我有如下公式字符串:

let a = '554898128.3227372 + (-1.35880 * (A * 12)) + (1.1171758319197438 * (B * 13)) + (0.8813173184360715 * (x + 1))';

let b = '10867.306445101707 + (1.6367961676820935 * (X + 1))';

我想将公式中的数字四舍五入到小数点后三位。最快的方法是什么?我曾考虑过使用a.split(' ');将我的字符串分割成数组并检查它是否为数字,但是对圆括号我该怎么办?公式必须保持相同,只是随后取整舍入值

3 个答案:

答案 0 :(得分:2)

一种简单的方法是提取所有看起来像数字的东西,然后应用toFixed

let a = '554898128.3227372 + (-1.35880 * (A * 12)) + (1.1171758319197438 * (B * 13)) + (0.8813173184360715 * (x + 1))';

a = a.replace(/-?\d+(\.\d+)?/g, n => Number(n).toFixed(3))

console.log(a)

更好但更复杂的选择是解析字符串并替换解析树中的数字。既然我认为您仍然需要使用它来评估公式,那么这实际上可能就是方法。

答案 1 :(得分:2)

我将使用正则表达式将数字字符与小数点匹配,捕获所有内容,直到前三位小数,然后替换为该捕获的组:

let a = '554898128.3227372 + (-1.35880 * (A * 12)) + (1.1171758319197438 * (B * 13)) + (0.8813173184360715 * (x + 1))';

console.log(
  a.replace(/(\d+\.\d{3})\d+/g, '$1')
);

答案 2 :(得分:1)

分割不会成功,因为您必须处理所有这些非数字符号并将它们放回原处。 处理公式的通用方法是编写词法分析器或为此使用第三者。 幸运的是,您可能只在正则表达式中使用replace方法,该方法可以匹配任何带有句点的数字,例如:

const a = '554898128.3227372 + (-1.35880 * (A * 12)) + (1.1171758319197438 * (B * 13)) + (0.8813173184360715 * (x + 1))';

const b = a.replace(/\d+\.\d+/g, function(n) {
    return Math.round(Number(n));
});

console.log(b);