允许在字符串输入中出现数学问题 (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')"));
有没有一种方法可以使用 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')"));