允许在字符串输入中出现数学问题 (JavaScript)

Allow math problems in string input (JavaScript)

有没有一种方法可以使用 JavaScript 将数学方程解析为输入?

例如,当用户输入“10-25”作为输入时,它被解析为-15

我尝试使用 eval,它有效,但它允许用户 运行 所有 JavaScript 代码,而不仅仅是数学方程式。

如果可能的话,我还想允许一些函数,例如 sin()cos()degreesToRadians(),但不是所有函数。

例子

"5" //returns 5
"12-20" //returns -8
"3/2" //returns 1.5
"sin(3.14)" //returns 0.00159265292
"sin(degreesToRadians(180/2)) * 10" //returns 10

"alert('hi')" //doesn't work

也许是这样的包裹:https://www.npmjs.com/package/nerdamer

我过去在几个项目中使用过 Nerdamer,它非常可靠。除此之外,除了实现我所知道的自己的 mini-parser 之外,没有“简单”的方法可以做到这一点。

您可以通过数学运算拆分表达式并检查它们。

下一个代码用于:( ) / *

mathExpression.replace(/([()/*])/g, "  ").split(" ").filter(v => v);

var allowedCommands = ["(", ")", /^\d*\.?\d*e?$/, "*", "/", "+", "-", "sin", "cos", "degreesToRadians"];

function checkCommand(arg) {
  return allowedCommands.some(v => {
    if (v instanceof RegExp) {
      return v.test(arg)
    } else {
      return v == arg;
    }
  });
}

function checkAllowedCommands(mathExpression) {
  var commands = mathExpression.replace(/([()/*+-])/g, "  ").split(" ").filter(v => v);
  var filterNotAllowedCommands = commands.filter(v => !checkCommand(v));
  return filterNotAllowedCommands.length == 0;
}


console.log(checkCommand("degreesToRadians"));
console.log(checkCommand("234"));

console.info("right expression");
console.info(checkAllowedCommands("sin(degreesToRadians(180/2)) * 10"));
console.info(checkAllowedCommands("(1.2e-6)"))
console.info(checkAllowedCommands("sin(1+2)"));

console.warn("wong expression");
console.info(checkAllowedCommands("alert('hi')"));