【问题标题】:Parse String to Values - Calculation将字符串解析为值 - 计算
【发布时间】:2015-07-04 07:36:57
【问题描述】:

我有一个这样的字符串:

var data ="(1+2*(3+2))";

我正在尝试解析字符串,以获得适当的结果。但我仍然没有得到任何解决方案,任何想法?

预期结果 = 11

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    试试

    var result = eval(data);
    

    虽然 eval 可能是邪恶的,但并非总是如此

    【讨论】:

    • 同意,eval 适合这里
    【解决方案2】:

    只要你100%确定输入绝对安全,就可以直接使用eval:

    var data ="(1+2*(3+2))";
    var res = eval(data);
    

    http://jsfiddle.net/kxy3hwh9/

    但是,如果您不信任输入,您可以考虑寻找不同的解决方案(仍然使用 eval),就像用户 Kennebec 在此处提出的那样:

    Eval alternative

    或者更好的是,您可以考虑使用第三方库,例如 mathjs:

    http://mathjs.org/

    你不应该使用 eval 的原因其实有很多,但只要你确定你可以控制你的输入流并且你绝对确定用户不能使用 eval 任何 evil 你也可以安全地使用 eval 范围。

    无论如何,因为 mathjs 存在,如果你需要进一步计算我个人推荐你 mathjs。

    在 mathjs 的情况下,代码应该是这样的:

    var data ="(1+2*(3+2))";
    var res = math.eval(data);
    

    小提琴: http://jsfiddle.net/jLxkn7no/

    另外,附带说明一下,要使用 mathjs 库,您只需包含一个脚本,它可以作为 cdn 使用: http://cdnjs.com/libraries/mathjs

    编辑:

    如果您不是 DL;DR;读者,请随意阅读以下内容:

    如果你好奇普通的eval()ma​​thjs的eval有什么区别,这里是直接取自源代码的sn-p:

    /**
           * Parse and evaluate the given expression
           * @param {String} expr   A string containing an expression, for example "2+3"
           * @return {*} result     The result, or undefined when the expression was empty
           * @throws {Error}
           */
          Parser.prototype.eval = function (expr) {
            // TODO: validate arguments
            return _parse(expr)
                .compile(math)
                .eval(this.scope);
          };
    

    和_parse:

    /**
           * Parse an expression. Returns a node tree, which can be evaluated by
           * invoking node.eval();
           *
           * Syntax:
           *
           *     parse(expr)
           *     parse(expr, options)
           *     parse([expr1, expr2, expr3, ...])
           *     parse([expr1, expr2, expr3, ...], options)
           *
           * Example:
           *
           *     var node = parse('sqrt(3^2 + 4^2)');
           *     node.compile(math).eval(); // 5
           *
           *     var scope = {a:3, b:4}
           *     var node = parse('a * b'); // 12
           *     var code = node.compile(math);
           *     code.eval(scope); // 12
           *     scope.a = 5;
           *     code.eval(scope); // 20
           *
           *     var nodes = math.parse(['a = 3', 'b = 4', 'a * b']);
           *     nodes[2].compile(math).eval(); // 12
           *
           * @param {String | String[] | Matrix} expr          Expression to be parsed
           * @param {{nodes: Object<String, Node>}} [options]  Available options:
           *                                                   - `nodes` a set of custom nodes
           * @return {Node | Node[]} node
           * @throws {Error}
           */
          math.parse = function parse (expr, options) {
            return _parse.apply(_parse, arguments);
          }
    
        };
    

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 1970-01-01
      • 2023-04-03
      • 2018-08-12
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多