Aquí es una manera de hacerlo. Este código está escrito en Java. Tenga en cuenta que no maneja los números negativos en este momento, pero puede agregar eso.
public class ExpressionParser {
public double eval(String exp, Map<String, Double> vars){
int bracketCounter = 0;
int operatorIndex = -1;
for(int i=0; i<exp.length(); i++){
char c = exp.charAt(i);
if(c == '(') bracketCounter++;
else if(c == ')') bracketCounter--;
else if((c == '+' || c == '-') && bracketCounter == 0){
operatorIndex = i;
break;
}
else if((c == '*' || c == '/') && bracketCounter == 0 && operatorIndex < 0){
operatorIndex = i;
}
}
if(operatorIndex < 0){
exp = exp.trim();
if(exp.charAt(0) == '(' && exp.charAt(exp.length()-1) == ')')
return eval(exp.substring(1, exp.length()-1), vars);
else if(vars.containsKey(exp))
return vars.get(exp);
else
return Double.parseDouble(exp);
}
else{
switch(exp.charAt(operatorIndex)){
case '+':
return eval(exp.substring(0, operatorIndex), vars) + eval(exp.substring(operatorIndex+1), vars);
case '-':
return eval(exp.substring(0, operatorIndex), vars) - eval(exp.substring(operatorIndex+1), vars);
case '*':
return eval(exp.substring(0, operatorIndex), vars) * eval(exp.substring(operatorIndex+1), vars);
case '/':
return eval(exp.substring(0, operatorIndex), vars)/eval(exp.substring(operatorIndex+1), vars);
}
}
return 0;
}
}
necesita importar java.util.Map.
Aquí es cómo utilizar este código:
ExpressionParser p = new ExpressionParser();
Map vars = new HashMap<String, Double>();
vars.put("x", 2.50);
System.out.println(p.eval(" 5 + 6 * x - 1", vars));
he publicado completa fuente de este problema aquí: http://stackoverflow.com/questions/174664/operators-as-strings –
posible duplicado de [Is es posible compilar y ejecutar un nuevo código en tiempo de ejecución en .NET?] (http://stackoverflow.com/questions/234217/is-it-possible-to-compile-and-execute-new-code-at-runtime- en-red) – nawfal
posible duplicado de [¿Hay un evaluador matemático de cadenas en .NET?] (http://stackoverflow.com/questions/355062/is-there-a-string-math-evaluator-in-net) –