如何在javascript中将字符串方程转换为数字?
假设我有“100*100”或“100x100”我如何评估它并转换为数字?
如果您确定字符串总是类似于“100*100”,您可以eval()
这样做,尽管大多数人会告诉您这不是一个好主意,因为人们可能会将恶意代码传递给 eval 'd。
eval("100*100");
>> 10000
否则,您将不得不查找或编写自定义方程解析器。在这种情况下,您可能想看看Shutting-yard algorithm,并阅读parsing。
使用split()
:
var myEquation = "100*100";
var num = myEquation.split("*")[0] * myEquation.split("*")[1];
>> 10000
这将为您提供字符串是否正在使用的产品*
或x
:
var str = "100x100";
var tmp_arr = str.split(/[*x]/);
var product = tmp_arr[0]*tmp_arr[1]; // 10000
使用 parseInt() ,parseInt() 函数解析一个字符串并返回一个整数。
parseInt("100")*parseInt("100") //10000
我对这里的用户答案有不同的看法,它使用 split 给出输出,但也重新创建了原始方程。我看到的其他答案使用 split 但并没有真正给出可以参数化原始方程的相关性,以开始为字符串格式。
使用split()
andfor
不是一个好的解决方案,但我在这里使用它来说明不需要知道数组中数字的数量(这将减少)的更好的解决方案。这样做的原因是它实际上就像 reduce 一样,但它需要您根据数组的大小来编辑 for 循环乘数:
let someEnvironmentVariable = '3*3*3'
let equationString = someEnvironmentVariable;
// regex to match anything in the set i.e. * and + << not sure if need the ending +
let re = /[\*\+]+/;
let equationToNumberArray = equationString.split(re).map(Number);
let equationResolver = 0;
for (const numericItem of equationToNumberArray) {
// recreate the equation above
equationResolver += numericItem*numericItem;
}
console.log(equationResolver);
一个更优雅的解决方案是使用
split()
:map()
和reduce()
let someEnvironmentVariable = '3*3*4*3'
let equationString = someEnvironmentVariable;
// regex to match anything in the set i.e. * and + << not sure if need the ending +
let re = /[\*\+]+/;
let equationToNumberArray = equationString.split(re).map(Number);
let arrayMultiplier = equationToNumberArray.reduce((a, b) => a * b);
console.log(arrayMultiplier);
使用 reduce 允许您遍历数组并对每个项目执行计算,同时保持对前一个项目的先前计算。
注意:我不喜欢这两种解决方案的一点是,即使是 reduce 也只需要一个数组集的数学运算。更好的解决方案是编写检测运算符并将其包含在整体解决方案中的代码。这使您可以不使用可怕的eval()
但也保持原始方程不变以供以后处理。
一个班轮:
str.split(/[x*]/).reduce((a,b) => a*b)