从字符串运行公式

Running an equation from a string

本文关键字:运行 字符串      更新时间:2023-09-26

我正在尝试创建一个简单的在线计算器,可以在JavaScript中运行基本计算。

我已经设法创建了界面,以便将数字和运算符存储在表单字段中。

我希望能够做的是将表单字段中的值传递给将计算表单字段总数的函数。

表单字段可以包含从简单的"10 + 10"到使用括号的更复杂的公式的任何内容。使用的运算符是+-*/

是否可以将表单字段的文本(字符串)传递给可以识别运算符并对值执行操作功能的 JavaScript 函数?

文本字段中的可能值为:

120/4+130/5

然后,该函数应返回 56 作为答案。当我知道这样的值时,我已经在 JavaScript 中完成了此操作:

function WorkThisOut(a,b,c,d) {
var total = a/b+c/d;
alert (total);
}
WorkThisOut(120,4,130,5);

我希望能够做的是将"120/4+130/5"的完整值传递给函数,它能够提取数字和运算符来创建总数。

有没有人对如何做到这一点或是否可能有任何想法? 这可能会变得更加复杂,我可能需要在括号中传递值"(120/4)+(130/5)"

我可能会因此而受到抨击。但是,无论如何它都在这里。

为此,我能想到三种解决方案:

  1. 实现你自己的解析器,词法分析器并解析出代码。这并不容易,但这可能是一次很棒的学习经历。
  2. 在仅用于此的子域下运行eval,以便脚本无法恶意访问您的网站
  3. 清理输入以仅包含12345678790+-/*().

 eval(input.replace(/[^0-9'(')'+'-'*'/'.]/g, ""));

请用技巧来绕过这个解决方案

您可以使用 math.js 库中包含的表达式解析器:

http://mathjs.org

用法示例:

math.eval('1.2 / (2.3 + 0.7)');   // 0.4
math.eval('5.08 cm in inch');     // 2 inch
math.eval('sin(45 deg) ^ 2');     // 0.5
math.eval('9 / 3 + 2i');          // 3 + 2i
math.eval('det([-1, 2; 3, 1])');  // -7

如果你不允许标识符,用 eval 很难造成太大的伤害。

function reval(string){
    var answer='';
    if(/^['d()'/*.+-]+$/.test(str)){
        try{
            answer= eval(str);
        }
        catch(er){
            answer= er.name+', '+er.message;
        }
    }
    return answer;
}

eval呢?

calc视为文本字段的 ID。

$('#calc').change(function(e){                
    alert(eval($(this).val()));
})

但请记住在处理之前验证输入。

这是一个

相当古老的话题,但对于有类似问题的新访问者:字符串数学包计算 [字符串] 方程,如上面的示例中120/4+130/5。它还识别括号。