Fórmulas matemáticas en C#

Introducción

Hola,

¿Necesitas que el usuario o una configuración externa defina fórmulas que tu sistema pueda interpretar?

¿Necesitas evaluar condiciones o reglas sin codificarlas directamente?

¿Necesitas construir aplicaciones más flexibles (por ejemplo, sistemas de cotizaciones, reglas de negocio, filtros personalizados)?

¿Necesitas validaciones que cambian sin necesidad de recompilar?

Pues justamente vamos a ver como conseguir eso mismo en C#.

Librería de expresiones matemáticas

Pues bien, te presento a NCalc.

NCalc es una librería muy útil, que te permite evaluar expresiones matemáticas o lógicas escritas como cadenas de texto (strings) en tiempo de ejecución.

¿Qué tipo de expresiones soporta?

Esta es una pequeña lista de las expresiones más habituales que soporta NCalc:

  • Operaciones matemáticas básicas: +, -, *, /
  • Comparaciones: ==, !=, >, <
  • Operadores lógicos: and, or, not
  • Funciones matemáticas: Sin, Cos, Pow, etc.
  • Variables: Puedes reemplazar variables con valores en tiempo de ejecución
  • Funciones personalizadas: Puedes crear tus propias funciones

Si estas interesado en conocer más acerca de las funciones matemáticas disponibles, aquí puedes echarle una vistazo.

Ejemplo: variables

Vamos a ver un primer ejemplo de cómo integrarlo en nuestro código en C#.

En este primer ejemplo, vamos a ver la utilización de variables con NCalc.

using System;
using NCalc;

class Program
{
    static void Main()
    {
        // Definimos la expresión con variables
        string expresion = "precio * cantidad + impuesto";

        // Creamos la instancia del evaluador
        Expression e = new Expression(expresion);

        // Asignamos dinámicamente los valores de los parámetros
        e.Parameters["precio"] = 19.99;
        e.Parameters["cantidad"] = 3;
        e.Parameters["impuesto"] = 5.5;

        // Evaluamos la expresión
        var resultado = e.Evaluate();

        // Mostramos el resultado
        Console.WriteLine($"Resultado de la expresión: {resultado}");
    }
}

Como has visto, no tiene mucho secreto.

Ejemplo: funciones personalizadas

En este segundo ejemplo, vamos a ver como definir funciones personalizadas en C# para utilizar en nuestra expression:

using System;
using NCalc;

class Program
{
    static void Main()
    {
        string expresion = "getPrecio() * getCantidad() + getImpuesto()";

        Expression e = new Expression(expresion);

        // Definimos las funciones personalizadas
        e.EvaluateFunction += (name, args) =>
        {
            switch (name)
            {
                case "getPrecio":
                    args.Result = ObtenerPrecio();
                    break;
                case "getCantidad":
                    args.Result = ObtenerCantidad();
                    break;
                case "getImpuesto":
                    args.Result = CalcularImpuesto();
                    break;
            }
        };

        var resultado = e.Evaluate();
        Console.WriteLine($"Resultado de la expresión: {resultado}");
    }

    // Funciones que generan parámetros dinámicos
    static double ObtenerPrecio()
    {
        // Podría venir de una base de datos, API, etc.
        return 12.5;
    }

    static int ObtenerCantidad()
    {
        // Simulación de un valor calculado
        return DateTime.Now.Second % 5 + 1; // valor entre 1 y 5
    }

    static double CalcularImpuesto()
    {
        // Un cálculo dinámico o configuración externa
        return 3.75;
    }
}

Conclusiones

En resumen, si necesitas formulas personalizables en tu aplicación, NCalc puede ser un gran aliadao para ti.

Saludos.

Deja un comentario