¿Hay alguna manera de analizar ecuaciones matemáticas como entrada usando JavaScript?
por ejemplo, cuando un usuario ingresa "10-25" como entrada, se analiza a -15
Intenté usar eval , que funciona, pero permite a los usuarios ejecutar todo el código JavaScript, no solo las ecuaciones matemáticas.
Si es posible, también me gustaría permitir algunas funciones, como sin() , cos() degreesToRadians() , pero no todas las funciones.
ejemplos
"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 workPuede dividir la expresión por operaciones matemáticas y verificarlas.
El siguiente código lo hace por: ( ) / *
mathExpression.replace(/([()/*])/g, " $1 ").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, " $1 ").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')"));Quizás algo como este paquete: https://www.npmjs.com/package/nerdamer
He usado Nerdamer en algunos proyectos en el pasado y es bastante sólido. Aparte de eso, no hay una forma "simple" de hacerlo sin implementar su propio mini-parser que yo sepa.