2

任何基本的加法、减法、乘法和除法方程都可以在控制台中输入或设置为变量:

var solve = (3 + 7) + 2 * 8 / 2 // 18

并正确解决。

我的代码没有这样做。我相信它与textarea有关。当我输入 (3 + 7) + 2 * 8 / 2 时,它显示 (3 + 7) + 2 * 8 / 2(而不是 18)。请注意,我的代码没有解决按钮,它会在输入问题时解决。

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

HTML

<textarea cols="50" rows="10" id="pSolve"></textarea>
<div id="answer"></div>

JavaScript

var input = document.getElementById("pSolve");

input.onkeyup = function() {
    // Solve the input
    finalAnswer = pSolve.value;

    // Display answer
    answer.innerHTML = finalAnswer;
}

我试过这个:

// Solve the input
finalAnswer = Number(pSolve.value);

认为它会解决它,但它没有工作。相反,什么都没有显示。我错过了什么或做错了什么?

4

4 回答 4

3

只需用于eval评估方程。

answer.innerHTML = eval(finalAnswer);

我更新了你的 jsFiddle


也看看这个答案。问题是关于解析公式,但它对任何事情都非常有用。

于 2013-09-07T22:24:15.660 回答
1

您只是从文本区域中提取一个字符串并将其粘贴到答案 div 中。字符串不仅由 javascript 评估!你实际上在做什么var solve = '(3 + 7) + 2 * 8 / 2';!你需要一个解析器来真正解决这个问题,就像在这个 SO post中一样。

于 2013-09-07T22:12:27.370 回答
1

您可以重复替换来评估算术表达式,因此:

function performOp(_, a, op, b) {
  switch (op) {
    case '+': return +a + +b;
    case '-': return +a - +b;
    case '*': return +a * +b;
    case '/': return +a / +b;
  }
}

function evaluateArithmetic(expr) {
  expr = expr.replace(/\s+/g, '');
  while (true) {
    var oldExprPS = expr;
    while (true) {
      var oldExprDM = expr;
      expr = expr.replace(/\((-?\d+)\)/g, '$1');
      expr = expr.replace(/(-?\d+)([*\/])(-?\d+)/g, performOp);
      expr = expr.replace(/\((-?\d+)([+\-])(-?\d+)\)/g, performOp);
      if (expr == oldExprDM) { break; }
    }
    expr = expr.replace(/(-?\d+)([+\-])(-?\d+)/g, performOp);
    if (expr == oldExprPS) { break; }
  }
  return +expr;
}

var input = document.getElementById("pSolve");

input.onkeyup = function() {
  // Solve the input
  finalAnswer = evaluateArithmetic(pSolve.value);

  // Display answer
  answer.innerHTML = finalAnswer;
};
于 2013-09-07T22:13:57.330 回答
1

您需要做更多的事情来求解在文本框中输入的方程。您当前的脚本仅按原样显示文本框的内容。你应该使用 MathJS。它应该有帮助。

MathJS 主页

于 2013-09-07T22:15:14.713 回答