matematicas - C#Calculadora matemática
evaluador de expresiones c# (7)
Posibles duplicados:
¿Hay un evaluador matemático de cuerdas en .NET?
Conversión de expresión de cadena en valor entero utilizando C #
La mejor y más corta forma de evaluar expresiones matemáticas
c # cadena de evaluación "3 * (4 + 2)" yield int 18
¿Hay alguna forma de calcular expresiones matemáticas como (2-3 / 4 * 12) de una manera diferente a la presentada aquí?
DataTable tiene un método Compute que le permite escribir esto:
var result = new DataTable().Compute("2-3/4*12", null);
Tenga en cuenta que esto se limita a expresiones matemáticas simples.
Otra opción consiste en utilizar un lenguaje dinámico en el DLR, como IronPython e IronRuby. Mira esta publicación :
var engine = new IronPython.Hosting.PythonEngine();
double result = pythonEngine.EvaluateAs<double>("2-3/4*12");
También puede consultar la biblioteca de NCalc en GitHub .
Definitivamente en la categoría "no recomendar", pero para completarlo: si tiene una base de datos a la que puede conectarse cómodamente, envíele la consulta "SELECCIONAR expresión ".
Echa un vistazo a FLEE (Evaluador rápido de expresiones livianas) - http://flee.codeplex.com/
Flee es un analizador de expresiones y un evaluador para .NET framework. Le permite calcular el valor de expresiones de cadena tales como sqrt (a ^ 2 + b ^ 2) en tiempo de ejecución. Utiliza un compilador personalizado, un lenguaje de expresión fuertemente tipado y un codegen liviano para compilar expresiones directamente a IL. Esto significa que la evaluación de expresiones es extremadamente rápida y eficiente. Pruebe la demostración, que le permite generar imágenes basadas en expresiones, y compruébelo usted mismo.
Es gratis y rápido y lo he usado en un par de proyectos.
Eso parece una solución muy exagerada.
Lo que realmente quieres es un analizador simple.
Debes dividir la cadena en tokens y luego evaluarlos. Esto te ayudará a comenzar a investigar. http://en.wikipedia.org/wiki/Parsing#Overview_of_process
Hay algunas opciones interesantes disponibles para ti.
NCalc : un analizador Lexer C # construido con ANTLR . Esto analizará su texto y le permitirá asignar valores a parámetros / variables. El intérprete es C #, por lo que no tiene que cargar montajes adicionales en un dominio de aplicación, etc.
JINT : un intérprete de JavaScript basado en C # creado por el mismo autor de ECalc que usa ANTLR para crear la gramática. Actualmente se encuentra en versión beta, pero funciona bien con cálculos y funciones.
CS-Script.Net : desde el sitio: "CS-Script es un sistema de scripts basado en CLR (Common Language Runtime) que usa C # compatible con ECMA como lenguaje de programación. Actualmente, CS-Script se dirige a la implementación de Microsoft de CLR (.NET 2.0 / 3.0 / 3.5) con soporte limitado en Mono ". Cargue los scripts y cree ensamblajes en la memoria y en el dominio de la aplicación por separado. Es bastante robusto y lo uso en producción para scripts incorporados.
La mejor opción es construir un árbol de Expresión. Primero construye el árbol de su expresión, luego use http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx y puede compilarlo fácilmente usando http://msdn.microsoft.com/en-us/library/bb356928(v=VS.100).aspx
NB: Esta respuesta es solo para completar. Definitivamente no es un enfoque que recomendaría.
Es posible acceder a las bibliotecas JScript (obsoletas) directamente desde C #, lo que significa que puede usar el equivalente de la función de eval
de JScript.
using Microsoft.JScript; // needs a reference to Microsoft.JScript.dll
using Microsoft.JScript.Vsa; // needs a reference to Microsoft.Vsa.dll
// ...
string expr = "2 - 3 / 4 * 12";
Console.WriteLine(JScriptEval(expr)); // displays -7
// ...
public static VsaEngine _engine = VsaEngine.CreateEngine();
public static double JScriptEval(string expr)
{
// error checking etc removed for brevity
return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString());
}