2011-03-29 30 views
6

Estoy buscando un intérprete de fórmula que pueda usar en una aplicación C#. Tiene que ser capaz de interpretar una cadena como esta:Necesito un intérprete de fórmula para .Net

max(1+2, 4) * x 

He encontrado Writing a fast formula interpreter (codeproject.com) que casi se hace lo que yo necesito, pero no permite funciones con múltiples parámetros. Probablemente podría agregar esa funcionalidad, pero me preguntaba si algo como esto ya existe.

Gracias

+1

posible duplicado: http://stackoverflow.com/questions/4629/c-eval-equivalent –

+0

Otro posible duplicado: http://stackoverflow.com/questions/355062/is-there-a-string-math- evaluator-in-net –

+1

Esas preguntas son relativamente antiguas: la respuesta de Corbins ya tiene enlaces a dos proyectos no mencionados en ninguna de esas dos preguntas, por lo que digo que mantengan abierta la pregunta. – Justin

Respuesta

1

realidad se puede construir un intérprete muy eficaz mediante el análisis y la reemplazar ciertas palabras clave funcionales como max con Math.Max y luego dynamically building and executing la fórmula como una clase y método C#. Entonces, en realidad estaría analizando y ajustando la fórmula y permitiendo que el compilador de C# la interprete y ejecute.

Por lo tanto, tomar su fórmula de ejemplo de max(1+2, 4) * x se convertiría en:

public class MyFormula 
{ 
    public double calc(double x) 
    { 
     return Math.Max(1+2, 4) * x; 
    } 
} 

Qué le recopilar sobre la marcha y luego ejecutar por el artículo enlazado. Todavía tiene que analizar y pasar el valor de x por supuesto.

+0

Esto parece peligroso si ciertas precauciones de seguridad no se cumplen. – Ozzah

+0

@Ozzah: Esto no es como inyección de SQL. Por un lado, limitaría la cantidad de entrada, y luego estaría analizando términos matemáticos como max, sin, cos, etc. Cualquier cosa que no sea kosher fallaría como un error de sintaxis. –

1

Hace mucho tiempo en un proyecto tuve que crear algunas reservas con fórmulas, y utilicé VsaEngine. Para usar este motor necesita agregar referencia al Microsoft.JScript. Aquí es ejemplo:

Código de uso es muy sencillo, basta con sustituir los parámetros de fórmula como:

string formula = "x+y"; 
formula= formula.Replace("x","100").Replace("y","200"); 
string result = CalculateFormula(formula); 

Y aquí es el método básico, CalculateFormula:

public string CalculateFormula(string evaluationString) 
{ 
     VsaEngine en = VsaEngine.CreateEngine(); 
     Object result = Eval.JScriptEvaluate(evaluationString, en); 
     return result.ToString(); 
} 

Con esto usted puede crear su costumbre motor de intérprete de fórmulas

Cuestiones relacionadas