2011-01-06 50 views
5

Estoy trabajando en una aplicación en C# en la que quiero calcular una expresión aritmética que se da como una cadena. Así como si tuviera una cadena:evaluar una expresión aritmética almacenada en una cadena (C#)

string myExpr="4*(80+(5/2))+2"; 

y quiero calcular el resultado de la expresión aritmética. Mientras estés en un lenguaje como JavaScript, PHP, etc. podrías usar Eval para hacer el truco, esto no parece ser una opción en C#.

Supongo que es posible escribir un código para dividirlo en innumerables expresiones simples, calcularlas y sumarlas, pero esto llevará bastante tiempo y es probable que tenga muchos problemas en mi intento de hacerlo. .

Entonces ... mi pregunta, ¿hay alguna forma 'simple' de hacer esto?

+1

posible duplicado de [C# Math calculator] (http://stackoverflow.com/questions/2859111/c-math-calculator) –

+0

posible duplicado de [Mejor y más corta forma de evaluar expresiones matemáticas] (http: // stackoverflow .com/questions/1437964/best-and-shortest-way-to-evaluate-mathematical-expressions) –

Respuesta

5

Hay una librería javascript puede hacer referencia, a continuación, sólo hacer algo como:

var engine = VsaEngine.CreateEngine(); 
Eval.JScriptEvaluate(mySum, engine); 

Editar; Biblioteca es Microsoft.JScript

+0

parece muy prometedor, esta es la primera prueba para mí. Gracias a todos por la fantástica y maldita ayuda rápida = D – user6

+1

VS2010 dice: Microsoft.JScript.Vsa.VsaEngine está en desuso. – Sam

5

Puede llamar simplemente a la función JScript.NET eval. Cualquier lenguaje .NET puede llamar a cualquier otro.

0

Debe implementar un evaluador de expresiones. Es bastante sencillo si tienes el fondo, pero no es "simple". Evaluar en entornos interpretados realmente vuelve a ejecutar el analizador de lenguaje sobre la cadena; necesita emular esa operación, para las partes que le interesan, en su código C#.

Busque "evaluadores de expresiones" y "analizador de descenso recursivo" para comenzar.

3

Ver esta respuesta:

C# Math calculator

+3

Esto realmente debería ser un voto para cerrar en lugar de intentar recopilar ... –

+1

http: //blog.stackoverflow. com/2011/01/the-wikipedia-of-long-tail-programming-questions/ –

-1

intentar algo como esto:

int mySum = 4*(80+(5/2))+2; 

var myStringSum = mySum.toString(); 
+0

Él quiere esencialmente lo contrario de eso. La expresión se almacena en una cadena. –

+0

aunque aprecio el intento que daría como resultado una cadena que contiene 332. – user6

0

Si usted tiene el lenguaje C++ de Bjarne Stroustrup Programación, en el capítulo 6 se explica paso a paso (en C++) cómo hacer exactamente lo que sugiere Chris Tavares.

Es sencillo pero un poco embriagador si no está familiarizado con el procedimiento.

0

que tenía que hacer algo similar para un projectand licenciatura encontré este

Reverse Polish Notation In C#

tutorial y el código a ser extremadamente valiosa.

Es más o menos una implementación de convertir la cadena a Notación Polaca Inversa y luego evaluarla. Es extremadamente fácil de usar, comprender y agregar nuevas funciones. El código fuente está incluido.

2

He usado NCalc con gran éxito. Es extremadamente flexible y permite variables en tus fórmulas.La fórmula que enumeró en su pregunta se podría evaluar esto fácilmente:

string myExpr = "4*(80+(5/2))+2"; 
decimal result = Convert.ToDecimal(new Expression(myExpr).Evaluate()); 
5

Ha visto http://ncalc.codeplex.com?

Es extensible, rápido (por ejemplo, tiene su propio caché) le permite proporcionar funciones personalizadas y variables en tiempo de ejecución mediante el manejo de eventos EvaluateFunction/EvaluateParameter. Expresiones de ejemplo que puede analizar:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); 

    e.Parameters["Pi2"] = new Expression("Pi * Pi"); 
    e.Parameters["X"] = 10; 

    e.EvaluateParameter += delegate(string name, ParameterArgs args) 
    { 
     if (name == "Pi") 
     args.Result = 3.14; 
    }; 

    Debug.Assert(117.07 == e.Evaluate()); 

También maneja Unicode & muchos tipo de datos de forma nativa. Viene con un archivo de astas si quieres cambiar la gramática. También hay un tenedor que soporta MEF para cargar nuevas funciones.

También es compatible con operadores lógicos, cadenas de fecha/hora y declaraciones if.

Cuestiones relacionadas