Parse Math Expression

¿Existe una manera fácil de analizar una expresión matemática simple representada como una cadena como (x + (2 * x) / (1-x)), proporcionar un valor para x y obtener un resultado?

Miré VSAEngine por varios ejemplos en línea, sin embargo, estoy recibiendo una advertencia de que este ensamblado ha quedado obsoleto y no lo uso.

Si hace alguna diferencia, estoy usando .NET 4.0.

Puede intentar usar DataTable.Compute .

Una relacionada es DataColumn.Expression .

También echa un vistazo: Hacer matemáticas en vb.net como Eval en javascript

Nota: Yo no los he usado yo.

Exijo precaución contra la elección de un evaluador de expresiones genéricas existente sobre un evaluador de matemáticas especialmente diseñado. La razón de esto es que los evaluadores de expresiones no están limitados solo a las matemáticas. Una persona inteligente podría usar esto para crear una instancia de cualquier tipo en el marco y llamar a cualquier método del tipo, y eso le permitiría hacer algunas cosas decididamente desagradables. Por ejemplo: new System.Net.WebClient().DownloadFile("illegalchildpornurl", "C:\openme.gif") evaluará muy bien en la mayoría de esos new System.Net.WebClient().DownloadFile("illegalchildpornurl", "C:\openme.gif") , y hará exactamente lo que parece (y te convertirá en un criminal al mismo tiempo).

Esto no significa que no busques algo que ya está escrito. Simplemente significa tener cuidado. Quieres uno que haga matemáticas, y solo matemáticas. La mayor parte de lo que ya está afuera no es tan quisquilloso.

Hace poco estuve usando mXparser, que es una biblioteca de analizador matemático. Le da mucha flexibilidad, como variables, funciones, constantes, operadores. A continuación, encontrará algunos ejemplos de uso:

Ejemplo 1 – fórmula simple

 Expression e = new Expression("1 + pi"); double v = e.calculate(); 

Ejemplo 2 – fórmula con variables, funciones, etc.

 Argument x = new Argument("x = 2"); Constant a = new Constant("a = sin(10)"); Function f = new Function("f(t) = t^2"); Expression e = new Expression("2*x + a - f(10)", x, a, f); double v = e.calculate(); 

https://mxparser.codeplex.com/

http://mathparser.org/

Atentamente

También echaré un vistazo a Jace ( https://github.com/pieterderycke/Jace ). Jace es un analizador matemático de alto rendimiento y un motor de cálculo que admite todos los sabores .NET (.NET 4.x, Windows Phone, Windows Store, …). Jace también está disponible a través de NuGet: https://www.nuget.org/packages/Jace

Aquí hay 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 vars){ int bracketCounter = 0; int operatorIndex = -1; for(int i=0; i 

}

Necesita importar java.util.Map.

Así es como uso este código:

  ExpressionParser p = new ExpressionParser(); Map vars = new HashMap(); vars.put("x", 2.50); System.out.println(p.eval(" 5 + 6 * x - 1", vars)); 

Otra opción que puede considerar es la funcionalidad de evaluación de expresiones de Spring.NET Framework. También puede hacer mucho más que matemáticas.

Sin embargo, todo el Framework Spring.NET podría ser un poco exagerado para sus necesidades si no necesita el rest de la funcionalidad.

Relacionado: Analizador de expresiones de ecuaciones con precedencia .

Como respondí en este hilo ( Best Free C # Math Parser usando variables, funciones definidas por el usuario, operadores personalizados ), puedes usar Mathos Parser , que puedes simplemente pegar en tu código fuente.

  Mathos.Parser.MathParser parser = new Mathos.Parser.MathParser(); string expr = "(x+(2*x)/(1-x))"; // the expression decimal result = 0; // the storage of the result parser.LocalVariables.Add("x", 41); // 41 is the value of x result = parser.Parse(expr); // parsing Console.WriteLine(result); // 38.95 

Te recomiendo que uses MEEL para esto.

 // parse string to IExpression (symbolic type) IExpression expression = BaseExpression.Parse("(x+(2*x)/(1-x))"); // create your own collection for attributes var attributes = new MathAttributeCollection(); // create local variable named "x" with value 5 var attributeX = new ScalarAttrInt("x") {Value = new ScalarConstInt(5)}; attributes.Add(attributeX); // execute math expression where x=5 var result = expression.Execute(attributes); MessageBox.Show(result.GetText()); // result: 2.5