Esta es una pequeña función que inventé hace un momento para resolver este problema: construye la expresión analizando la cadena un carácter a la vez (en realidad es bastante rápido). Esto tomará cualquier expresión matemática (limitada a +, -, *,/operadores solamente) y devolverá el resultado. También puede manejar valores negativos y operaciones de números ilimitados.
El único "por hacer" que queda es asegurarse de que calcula * &/before + & -. Agregaré esa funcionalidad más adelante, pero por ahora esto hace lo que necesito ...
/**
* Evaluate a mathematical expression (as a string) and return the result
* @param {String} expr A mathematical expression
* @returns {Decimal} Result of the mathematical expression
* @example
* // Returns -81.4600
* expr("10.04+9.5-1+-100");
*/
function expr (expr) {
var chars = expr.split("");
var n = [], op = [], index = 0, oplast = true;
n[index] = "";
// Parse the expression
for (var c = 0; c < chars.length; c++) {
if (isNaN(parseInt(chars[c])) && chars[c] !== "." && !oplast) {
op[index] = chars[c];
index++;
n[index] = "";
oplast = true;
} else {
n[index] += chars[c];
oplast = false;
}
}
// Calculate the expression
expr = parseFloat(n[0]);
for (var o = 0; o < op.length; o++) {
var num = parseFloat(n[o + 1]);
switch (op[o]) {
case "+":
expr = expr + num;
break;
case "-":
expr = expr - num;
break;
case "*":
expr = expr * num;
break;
case "/":
expr = expr/num;
break;
}
}
return expr;
}
AFAIK no. Para eso eval(), pero supongo que quieres una solución segura ... – Tronic
Muy similar, pero probablemente no sea lo que estás pidiendo: '(Función (" return 1 + 1; "))()'. – Gumbo