代码之家  ›  专栏  ›  技术社区  ›  wheresrhys

在JavaScript中将字符串作为数学表达式求值

  •  53
  • wheresrhys  · 技术社区  · 14 年前

    如何解析和计算字符串中的数学表达式(例如。 '1+1' )不调用 eval(string)

    '1+1' 然后回来 2 .

    14 回复  |  直到 11 年前
        1
  •  9
  •   Aniket Kudale    4 年前

    你可以用 JavaScript Expression Evaluator library ,它允许您执行以下操作:

    Parser.evaluate("2 ^ x", { x: 3 });
    

    mathjs ,它允许以下内容:

    math.eval('sin(45 deg) ^ 2');
    

        2
  •  3
  •   shreyasm-dev Benjamin Pasero    4 年前

    您可以轻松地执行+或-操作:

    function addbits(s) {
      var total = 0,
          s = s.match(/[+\-]*(\.\d+|\d+(\.\d+)?)/g) || [];
          
      while (s.length) {
        total += parseFloat(s.shift());
      }
      return total;
    }
    
    var string = '1+23+4+5-30';
    console.log(
      addbits(string)
    )

    更复杂的数学使eval更具吸引力,当然也更容易编写。

        3
  •  0
  •   marc_s    3 年前

    总得有人来分析这个字符串。如果不是口译员(通过 eval )然后,你需要编写一个解析例程来提取数字、运算符和任何你想在数学表达式中支持的东西。

    评估 . 如果您担心安全性(因为您正在解析的输入不是来自您控制的源代码),那么您可以在将输入传递给服务器之前检查输入的格式(通过白名单regex过滤器) 评估 ?

        4
  •  0
  •   Arne Jenssen    3 年前

    一个替代@kennebec的优秀答案的方法是,使用一个较短的正则表达式并允许运算符之间有空格

    function addbits(s) {
        var total = 0;
        s = s.replace(/\s/g, '').match(/[+\-]?([0-9\.\s]+)/g) || [];
        while(s.length) total += parseFloat(s.shift());
        return total;
    }
    

    addbits('5 + 30 - 25.1 + 11');
    

    更新

    function addbits(s) {
        return (s.replace(/\s/g, '').match(/[+\-]?([0-9\.]+)/g) || [])
            .reduce(function(sum, value) {
                return parseFloat(sum) + parseFloat(value);
            });
    }
    
        5
  •  0
  •   Salim Hamidi    3 年前

    BigEval 为了同样的目的。
    在求解表达式时,它的性能与 Eval() 您还可以在表达式中使用函数和常量(或者说变量)。表达式在中求解 PEMDAS order 这在包括JavaScript在内的编程语言中很常见。

    var Obj = new BigEval();
    var result = Obj.exec("5! + 6.6e3 * (PI + E)"); // 38795.17158152233
    var result2 = Obj.exec("sin(45 * deg)**2 + cos(pi / 4)**2"); // 1
    var result3 = Obj.exec("0 & -7 ^ -7 - 0%1 + 6%2"); //-7
    

    它也可以用来使用这些大的数字库的算术情况下,你正在处理与任意精度的数字。