2

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

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

我想做的是将表单字段中的值传递给一个函数,该函数将计算表单字段的总数。

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

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

文本字段中的可能值是:

120/4+130/5

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

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

4

5 回答 5

7

我可能会因此而受到抨击。但是,不管怎样,一切都过去了。

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

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

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

请使用技巧来解决此解决方案

于 2012-06-01T22:10:32.690 回答
5

您可以使用 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
于 2013-04-28T12:53:13.377 回答
2

如果您不允许使用标识符,那么 eval 很难造成很大的损害。

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

    }
    return answer;
}
于 2012-06-01T22:05:58.350 回答
1

怎么样eval

考虑calc作为文本字段的 id。然后

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

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

于 2012-06-01T22:02:36.727 回答
1

这是一个相当古老的话题,但对于有类似问题的新访问者:string-math包计算 [String] 方程,如上面的示例120/4+130/5。它还识别括号。

于 2018-02-01T20:38:55.120 回答