2010-05-18 14 views
22

posibles duplicados:
Is there a string math evaluator in .NET?
Converting string expression to Integer Value using C#
Best and shortest way to evaluate mathematical expressions
c# evaluating string “3*(4+2)” yield int 18C# Math Calculator

¿Hay una manera de calcular expresiones matemáticas como (2-3/4 * 12) de una manera diferente a la presentada aquí?

http://www.c-sharpcorner.com/uploadfile/mgold/codedomcalculator08082005003253am/codedomcalculator.aspx

+0

http://stackoverflow.com/questions/333737/, http://stackoverflow.com/questions/234217/, http://stackoverflow.com/questions/1437964/, http://stackoverflow.com/ preguntas/355062/ –

Respuesta

60

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 sencillas.

Otra opción consiste en utilizar un lenguaje dinámico en el DLR como IronPython e IronRuby. Salida De this post:

var engine = new IronPython.Hosting.PythonEngine(); 
double result = pythonEngine.EvaluateAs<double>("2-3/4*12"); 

También puede comprobar el NCalc library on GitHub.

+1

Interesante. ¡Nunca supo que existiera tal cosa! –

+0

¿Cómo funciona 'Compute'? Usando SQL Server para ejecutar? –

+1

El uso de DataTable para calcular expresiones de cadenas es bastante rápido, pero has mostrado una forma muy breve y concisa de usarlo. Prestigio. – froggythefrog

4

Salida HUIR (Evaluador de Expresión Rápido Ligero) - http://flee.codeplex.com/

Huid es un analizador de expresiones y evaluador para el. 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.

+0

Parece genial. ¿Puedes compartir cómo lo has usado de otra forma que no sea para la expresión estándar eval; p.ej. ¿Cómo afectó su arquitectura, etc. –

+0

+! FLEE es increíblemente increíble e increíblemente fácil de usar. – MasterMastic

3

NB: Esta respuesta es solo para completarse. Definitivamente no es un enfoque que recomendaría.

Es posible acceder a las bibliotecas JScript (en desuso) directamente desde C#, lo que significa que puede usar el equivalente de la función 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()); 
} 
8

Hay algunas opciones interesantes disponibles para usted.

  1. NCalc - C# Lexer Parser built with 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.

  2. JINT - un intérprete de JavaScript basado en C# creado por el mismo autor de ECalc utilizando ANTLR para crear la gramática. Actualmente se encuentra en versión beta, pero funciona bien con cálculos y funciones.

  3. CS-Script.Net - Desde el sitio:. "CS-Script es un CLR (Common Language Runtime) sistema de scripting basado que utiliza ECMA-compatible con C# como lenguaje de programación CS-Script Actualmente objetivos 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.

+0

I second NCalc: lo he usado extensamente y lo encontré muy estable. – GreyCloud

+0

En una nota diferente, los chicos de NCalc tienen un intérprete de javascript de C# llamado Jint en codeplex.com. He jugado un poco con él y puedo ejecutar el microtemplate.js original de John Resig con él. –

3

Definitivamente en la categoría de "no lo recomiendan", pero está completo - si usted tiene una base de datos que convenientemente se puede conectar, lo envía la consulta "SELECT expresión".