Ejecutar un String

13/11/2009 - 19:18 por Carlos de la B | Informe spam
Saludos a todos,

Estoy tratando de hacer una clase que ejecute un string.
De esta manera:

double result = Eval("Sqr(Sin(12) * Cos(6)) * 28");

La idea es pasar un string con una fórmula matematica y que el resultado sea
un double.

Podría darme alguien alguna pista de como seguir.

Muchas gracias,
carlosdelab

Preguntas similare

Leer las respuestas

#1 Sashka
13/11/2009 - 20:02 | Informe spam
Necesitas un parser, por ejemplo : http://simplemathparser.codeplex.com/

Sashka

"Carlos de la B" escribió en el mensaje de
noticias:
Saludos a todos,

Estoy tratando de hacer una clase que ejecute un string.
De esta manera:

double result = Eval("Sqr(Sin(12) * Cos(6)) * 28");

La idea es pasar un string con una fórmula matematica y que el resultado
sea
un double.

Podría darme alguien alguna pista de como seguir.

Muchas gracias,
carlosdelab
Respuesta Responder a este mensaje
#2 Alberto Poblacion
13/11/2009 - 20:11 | Informe spam
"Carlos de la B" wrote in message
news:
Estoy tratando de hacer una clase que ejecute un string.
De esta manera:

double result = Eval("Sqr(Sin(12) * Cos(6)) * 28");

La idea es pasar un string con una fórmula matematica y que el resultado
sea
un double.

Podría darme alguien alguna pista de como seguir.



Pista: Hay que tomar la expresión y meterla dentro de una función que se
encuentre dentro de una clase. Todo ello lo puedes hacer concatenando los
textos en un String. Una vez que tienes ese string, lo compilas en memoria
usando una de las clases que el Framework tiene para ello (por ejemplo,
usando la clase CSharpCodeProvider y pasándole en los CompilerParameters la
opción CompileInMemory, si no recuerdo mal).
Una vez compilada la clase, se usa Reflexión para llamar al método que
escribiste dentro, recogiendo el resultado, que es el valor de tu expresión
inicial.
Respuesta Responder a este mensaje
#3 Gustavo Cantero
14/11/2009 - 23:17 | Informe spam
Carlos:
Al leer tu pregunta recordé que hace unos años hice esto mismo, por eso
acabo de escribir un artículo en nuestro blog donde lo explico. La
dirección del mismo es
http://www.programandoamedianoche.c...jecutarla.
Espero te sea de utilidad.
Suerte!

Gustavo A. Cantero
Scientia® Soluciones Informáticas
MCP - MCSD - MCTS - MCPD
http://www.scientia.com.ar
http://www.programandoamedianoche.com
http://foro.scientia.com.ar


De: Carlos de la B [mailto:]
Expuesto a las: Viernes, 13 de Noviembre de 2009 03:18 p.m.
Expuesto en: microsoft.public.es.csharp
Conversación: Ejecutar un String
Asunto: Ejecutar un String

Saludos a todos,

Estoy tratando de hacer una clase que ejecute un string.
De esta manera:

double result = Eval("Sqr(Sin(12) * Cos(6)) * 28");

La idea es pasar un string con una fórmula matematica y que el resultado
sea
un double.

Podría darme alguien alguna pista de como seguir.

Muchas gracias,
carlosdelab
Respuesta Responder a este mensaje
#4 Anonimo
16/11/2009 - 05:22 | Informe spam
El artículo de Gustavo Cantero es preciso. Quisiera agregar que cuando la
expresión trae parámetros, es necesario implementar algo más de código
(medianoche también).
Por ejemplo, tienes la expresión f( X)=x^3+x^2+1, donde x es un parámetro
variable. Bien el código puede ser:

public static double Evaluate(string Function, double x)
{
string code = "using System;"
+ "public class Function "
+ "{"
+ " public double Evaluate(double x) {return " + Function
+ ";}"
+ "}";

CompilerParameters p = new CompilerParameters()
{
GenerateInMemory = true, GenerateExecutable = false,
IncludeDebugInformation = false
};

CodeDomProvider cdp = CodeDomProvider.CreateProvider("CSharp");
CompilerResults r = cdp.CompileAssemblyFromSource(p, code);

object f = r.CompiledAssembly.CreateInstance("Function", false,
BindingFlags.CreateInstance, null, null, null, null);
// now, f is an instance of Function class ...
return (double)f.GetType().InvokeMember("Evaluate",
BindingFlags.InvokeMethod, null, f, new object[] { x });
}

Nota el ultimo parámetro de InvokeMember ... Es acá donde paso los
parámetros a la función

Y se ejecuta de la siguiente manera (p.e. deseo f(0.5))

lblResult.Text = Evaluate("Math.Pow(x, 3) + Math.Pow(x, 2) + 1",
0.5D).ToString();

Saludos,
<Harvey Triana />

"Gustavo Cantero" escribió en el mensaje de
noticias:
Carlos:
Al leer tu pregunta recordé que hace unos años hice esto mismo, por eso
acabo de escribir un artículo en nuestro blog donde lo explico. La
dirección del mismo es
http://www.programandoamedianoche.c...jecutarla.
Espero te sea de utilidad.
Suerte!

Gustavo A. Cantero
Scientia® Soluciones Informáticas
MCP - MCSD - MCTS - MCPD
http://www.scientia.com.ar
http://www.programandoamedianoche.com
http://foro.scientia.com.ar


De: Carlos de la B [mailto:]
Expuesto a las: Viernes, 13 de Noviembre de 2009 03:18 p.m.
Expuesto en: microsoft.public.es.csharp
Conversación: Ejecutar un String
Asunto: Ejecutar un String

Saludos a todos,

Estoy tratando de hacer una clase que ejecute un string.
De esta manera:

double result = Eval("Sqr(Sin(12) * Cos(6)) * 28");

La idea es pasar un string con una fórmula matematica y que el resultado
sea
un double.

Podría darme alguien alguna pista de como seguir.

Muchas gracias,
carlosdelab

Respuesta Responder a este mensaje
#5 Jesús López
16/11/2009 - 18:31 | Informe spam
También puedes usar la clase Eval de JScript.

Añades una referencia a los ensamblados:

Microsoft.Vsa
Microsoft.JScript

Y ya puedes escribir un código como este:

Microsoft.JScript.Vsa.VsaEngine engine =
Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
object result = Microsoft.JScript.Eval.JScriptEvaluate("3 + 4 * 5", engine);
MessageBox.Show(result.ToString());


Saludos:

Jesús López


"Carlos de la B" wrote in message
news:
Saludos a todos,

Estoy tratando de hacer una clase que ejecute un string.
De esta manera:

double result = Eval("Sqr(Sin(12) * Cos(6)) * 28");

La idea es pasar un string con una fórmula matematica y que el resultado
sea
un double.

Podría darme alguien alguna pista de como seguir.

Muchas gracias,
carlosdelab
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida