none
Resolver expresiones numericas RRS feed

  • Pregunta

  • ¿Existe alguna función, componente, DLL, etc, para resolver expresiones numericas que tengo almacenadas como texto?

    Ejemplo:

    Tengo la siguiente variable tipo String con la siguiente formula

    Dim vExp as String = "(10*2) + (5) - (125) * (2) / (15)" 

    y quisiera obtener el resultado

    jueves, 14 de julio de 2016 10:30

Respuestas

  • Hola:
    En un Form con 1 TextBox, 1 Label y 1 Button, copia y pega el siguiente código

    Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim resultado As Object = ModuleCodeDom.Eval(TextBox1.Text)
            Me.Label1.Text = Convert.ToString(resultado)
        End Sub
    End Class

    Añadir al proyecto un modulo cuyo codigo es:

    Imports System.CodeDom.Compiler
    Imports System.Reflection
    Module ModuleCodeDom
        Private CrLf As String = Environment.NewLine

        Public Function Eval(ByVal expresion As String) As Object
            ' Autor: Eduardo A. Morcillo
            ' Parámetros que utilizará el compilador
            Dim cpar As New CompilerParameters()
            'cpar.GenerateExecutable = False     ' Generar DLL
            cpar.GenerateInMemory = True         ' Generar en memoria
            'cpar.IncludeDebugInformation = True
            ' Añadir referencias
            cpar.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
            ' Referenciamos el compilador de código de Visual Basic
            Dim vbcp As New VBCodeProvider()
            ' Escribimos el código fuente del ensamblado
            Dim source As String = "Imports Microsoft.VisualBasic" & CrLf & "Namespace MiNamespace" & CrLf & "  Public Class MiClase" & CrLf & "    Public Shared Function Eval() As Object " & CrLf & "       Return " & expresion & CrLf & "    End Function" & CrLf & "  End Class" & CrLf & "End Namespace"
            ' Compilamos el ensamblado
            Dim res As CompilerResults = vbcp.CompileAssemblyFromSource(cpar, source)
            res.TempFiles.KeepFiles = True
            '
            If (res.Errors.Count > 0) Then Return res.Errors(0).ErrorText
            ' Obtengo el Type de la clase recien compilada
            Dim ty As System.Type = _
                res.CompiledAssembly.GetType("MiNamespace.MiClase")
            ' Obtengo el metodo Eval de la clase
            Dim funceval As MethodInfo = ty.GetMethod("Eval")
            ' Ejecuto la funcion Eval recien creada
            Return funceval.Invoke(Nothing, Nothing)
        End Function
    End Module

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta PGF_MSDN jueves, 14 de julio de 2016 11:57
    jueves, 14 de julio de 2016 11:01

Todas las respuestas

  • Puedes utilizar la librería Microsoft.JScript para evaluarlas utilizando el motor de JavaScript:

    .NET Framework. Evaluar expresiones aritméticas


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    jueves, 14 de julio de 2016 10:45
  • Hola:
    En un Form con 1 TextBox, 1 Label y 1 Button, copia y pega el siguiente código

    Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim resultado As Object = ModuleCodeDom.Eval(TextBox1.Text)
            Me.Label1.Text = Convert.ToString(resultado)
        End Sub
    End Class

    Añadir al proyecto un modulo cuyo codigo es:

    Imports System.CodeDom.Compiler
    Imports System.Reflection
    Module ModuleCodeDom
        Private CrLf As String = Environment.NewLine

        Public Function Eval(ByVal expresion As String) As Object
            ' Autor: Eduardo A. Morcillo
            ' Parámetros que utilizará el compilador
            Dim cpar As New CompilerParameters()
            'cpar.GenerateExecutable = False     ' Generar DLL
            cpar.GenerateInMemory = True         ' Generar en memoria
            'cpar.IncludeDebugInformation = True
            ' Añadir referencias
            cpar.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
            ' Referenciamos el compilador de código de Visual Basic
            Dim vbcp As New VBCodeProvider()
            ' Escribimos el código fuente del ensamblado
            Dim source As String = "Imports Microsoft.VisualBasic" & CrLf & "Namespace MiNamespace" & CrLf & "  Public Class MiClase" & CrLf & "    Public Shared Function Eval() As Object " & CrLf & "       Return " & expresion & CrLf & "    End Function" & CrLf & "  End Class" & CrLf & "End Namespace"
            ' Compilamos el ensamblado
            Dim res As CompilerResults = vbcp.CompileAssemblyFromSource(cpar, source)
            res.TempFiles.KeepFiles = True
            '
            If (res.Errors.Count > 0) Then Return res.Errors(0).ErrorText
            ' Obtengo el Type de la clase recien compilada
            Dim ty As System.Type = _
                res.CompiledAssembly.GetType("MiNamespace.MiClase")
            ' Obtengo el metodo Eval de la clase
            Dim funceval As MethodInfo = ty.GetMethod("Eval")
            ' Ejecuto la funcion Eval recien creada
            Return funceval.Invoke(Nothing, Nothing)
        End Function
    End Module

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta PGF_MSDN jueves, 14 de julio de 2016 11:57
    jueves, 14 de julio de 2016 11:01
  • Asier esto no funciona

      

    Dim engine As VsaEngine = VsaEngine.CreateEngine() TryDim o As Object = Eval.JScriptEvaluate(expression, engine) Return System.Convert.ToDouble(o).ToString() CatchReturn "No se puede evaluar la expresión"End Try engine.Close()

    Utilizo esto:

    Dim v As New Microsoft.JScript.Vsa.VsaEngine

    pero me advierte que es obsoleto.

    jueves, 14 de julio de 2016 11:27
  • Esto me sirvió. 

    Muchas gracias J.Carlos.

    jueves, 14 de julio de 2016 11:57