encontré esto:
¿Pero estoy trabajando con JScript? ¿O mantengo la forma de C#?
Todo ese código está escrito en
C#, pero el método
Eval.JScriptEvaluate llama al intérprete
JScript de
Microsoft para evaluar código de
JScript/
javascript (es exactamente el mismo lenguaje), ya sea evaluar una expresión aritmética o no.
Esas classes de
Microsoft.JScript quedaron obsoletas desde hace más de una década, deberías evitar su utilización, pues empezariamos muy mal si desarrollasemos una aplicación como una calculadora (la cual implica una mínima eficiencia posible) usando miembros deprecados, por muy buenos resultados que te de al evaluar... por algún buen motivo habrá quedado deprecada esa metodología.
si es JScript.. ¿se puede realizar en C#?
Si, puedes evaluar expresiones aritméticas en puro código administrado de C#/VB.Net.
Una manera sería compilando la expressión para devolver la respuesta, para ello puedes utilizar los proveedores de código de VB.Net o C (lee acerca de las classes
VBCodeProvider o
CSharpCodeProvider y
CodeDomProvider), pero hacerlo implicaría fugas de memoria inevitables, ya que por cada evaluación realizada se generaría un ensamblado .Net que jamás serían liberados hasta finalizar la aplicación, así que no te lo recomiendo.
La otra forma sería demasiado tediosa o compleja, hablamos de desarrollar tu propio evaluador de expresiones, idear los algoritmos para tokenizar la expresión, hacer los cálculos, llevar los controles de errores, etc. No vale la pena trabajar en algo así cuando ya existen librerías open-source para .Net que han estado optimizando esa tarea durante años.
Te recomiendo la librería
NCalc:
➢
NCalc - Mathematical Expressions Evaluator for .NET - CodePlexLa página está plagado de ejemplos en
C#, así que mostraré uno en
VB.Net:
Dim exp As String = "(1 + (2 - 2)) * (100 / 2.5)" ' = 40
Dim calc As New NCalc.Expression(exp)
Dim result As Decimal
If Not calc.HasErrors() Then
result = CDec(calc.Evaluate())
Else
MessageBox.Show(calc.Error)
End If
De todas formas, si por algún motivo quieres reinventar la rueda o hacer tu propia implementación personalizada, aquí te muestro dos buenos ejemplos...
Este código fuente parece estar muy bien, está orientado a la evaluación de expresiones aritméticas, y las expresiones soportan el uso de las funciones de la class
System.Math (abc, exp, floor, round, pow, etc...) :
➢
A C# Expression Evaluator - Black Belt CoderEste código fuente está orientado a la evaluación de expresiones de varios tipos, incluyendo expresiones aritméticas claro está:
➢
The expression evaluator revisited (Eval function in 100% managed .NET) - CodeProject( debe ser un poco lento al evaluar objetos, por el uso de
Reflection )
Saludos