Tabla de contenidos
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.