对字符串中的所有数字进行舍入



我有这样的公式字符串:

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(' ');将字符串拆分为数组并检查它是否是数字,但是我该怎么办圆括号?公式必须保持不变,只是之后的四舍五入值

一种粗略的方法是提取所有看起来像数字的内容并应用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)

一个更好但更复杂的选项是解析字符串并替换解析树中的数字。由于我认为无论如何您都需要这个来评估公式,这实际上可能是要走的路。

我会使用正则表达式将数字字符与小数匹配,捕获前 3 位小数点之前的所有内容,并替换为捕获的组:

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')
);

拆分不会做任何技巧,因为您必须处理所有这些非数字符号并将它们重新组合在一起。 处理公式的通用方法是编写词法分析器或使用一些第三方。 幸运的是,在这里,您可能只是将替换方法与正则表达式一起使用,该方法将任何数字与句点匹配,如下所示:

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);

最新更新