jueves, 30 de abril de 2015

.NET Framework. Evaluar expresiones aritméticas

Implementar un evaluador de expresiones aritméticas puede resultar una tarea ardua. Sin embargo el Framework de .NET nos permite utilizar el motor de JScript para evaluar expresiones matemáticas de forma sencilla.



Para crear el evaluador de expresiones voy crear un nuevo proyecto Windows Forms MathExpressionEvaluator.

Crear proyecto MathExpressionEvaluator

Le he añadido al proyecto una referencia al ensamblado Microsoft.JScript para tener acceso a las clases que nos proporcionan la funcionalidad del motor de JScript.

Añadir referencia a Microsoft.JScript

En el formulario que Visual Studio crea por defecto he añadido un TextBox (con nombre txtExpression) que nos sirva para introducir las expresiones a evaluar, un Button (con nombre btnEvaluate) para realizar la evaluación, y un Label (con nombre lblResultado) que utilizaré para mostrar el resultado de la evaluación.

En el código del formulario voy a crear el método que evalúa las expresiones.

        private string EvalExpression(string expression)
        {
            VsaEngine engine = VsaEngine.CreateEngine();
            try
            {
                object o = Eval.JScriptEvaluate(expression, engine);
                return System.Convert.ToDouble(o).ToString();
            }
            catch
            {
                return "No se puede evaluar la expresión";
            }
            engine.Close();
        }
    Private Function EvalExpression(expression As String) As String
        Dim engine As VsaEngine = VsaEngine.CreateEngine()
        Try
            Dim o As Object = Eval.JScriptEvaluate(expression, engine)
            Return System.Convert.ToDouble(o).ToString()
        Catch
            Return "No se puede evaluar la expresión"
        End Try
        engine.Close()
    End Function



El código es sencillo. Simplemente creo una instancia del motor JScript y paso al método JScriptEvaluate de la clase Eval la expresión a evaluar. Si la evaluación se realiza sin errores y devuelve un valor numérico se devuelve el resultado. Si no devuelve un mensaje indicando que no se ha podido evaluar la expresión.

Para probar el método he creado un controlador para el evento Click del botón btnEvaluate para evaluar el contenido del txtExpression y dejar el resultado en lblResultado.

        private void btnEvaluate_Click(object sender, EventArgs e)
        {
            lblResultado.Text = EvalExpression(txtExpression.Text);
        }
    Private Sub btnEvaluate_Click(sender As Object, e As EventArgs) Handles btnEvaluate.Click
        lblResultado.Text = EvalExpression(txtExpression.Text)
    End Sub

Si arrancamos el proyecto podemos probar el evaluador de expresiones.

Ejemplo de evaluación de expresión matemática

El código completo de este artículo, tanto en C# como en Visual Basic, está disponible en:

Evaluador de expresiones matemáticas


3 comentarios:

  1. Lo probé con paréntesis corchete y potencias, y no funciona.

    ResponderEliminar
  2. Los paréntesis debería respetarlos a la hora de alterar la precedencia de operadores. Otro tema es el de las potencias.
    Este es un truco sencillo para evaluar expresiones matemáticas simples que lo que hace es llamar al motor de javascript y ejecutar un 'eval' de la expresión introducida. En este lenguaje no existe un operador para la operación de potencia por lo que la única manera de hacer esta operación es por código. De hecho si escribes la instrucción correspondiente (por ejemplo 'Math.pow(3,2)') te la ejecutará sin problemas.

    ResponderEliminar
  3. Muchas gracias me sirvio, esto se puede mejorar y hacer algo chevere

    ResponderEliminar