Formel in Textbox mit ScriptControl

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Formel in Textbox mit ScriptControl

    Hallo,

    ich habe 2 Textboxen, in die Textbox mit dem Namen GeländerFormelTextbox möchte ich eine Formel eingeben und in der Textbox GeländerTextbox soll das Ergebnis angezeigt werden.

    Mit folgenden Code funktioniert es bereits sehr gut, jedoch funktionieren , (Kommazahlen) nicht.



    VB.NET-Quellcode

    1. Dim SC As New MSScriptControl.ScriptControl
    2. SC.Language = "VBScript"
    3. Dim Formel As String
    4. Dim Muster As String = "^([0-9\s\-+*/()]+)$" ' Formelstruktur
    5. Dim Regex As New Regex("")
    6. Formel = GeländerFormelTextBox.Text
    7. If Regex.IsMatch(Formel, Muster) Then ' Grobe Strukturprüfung
    8. Try
    9. GeländerTextBox.Text = SC.Eval(Formel) ' Formel berechnen
    10. Catch ex As Exception
    11. MessageBox.Show("Falsche Formelstruktur")
    12. End Try
    13. Else
    14. MessageBox.Show("Formel enthält Fehler")
    15. End If
    16. GeländerTextBox.Text = Format(GeländerTextBox.Text, "Currency") 'damit wird in Währung € formatiert




    Wenn ich z.B. 200+200 eingebe bekomme ich das richtige Ergebnis von 400.

    Gebe ich jedoch 200,40+200,40 ein, so kommt die Meldung Formel enthält Fehler.



    Wie kann ich meinen Code anpassen, dass ich auch mit Kommazahlen rechnen kann?

    toeller schrieb:

    Dim Muster As String = "^([0-9\s\-+*/()]+)$" ' Formelstruktur

    Kann es sein, dass "0-9" ein Ganzzahlausdruck ist?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    In der Definition für RegEx-Ausdrücke. siehe RegexTester.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du gibst Deinen Text ein und kannst online das RegEx-Pattern optimieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Oje, das ist mir als Anfänger alles viel zu schwierig. Ich glaube ich muss mir da im Internet einen fertigen Code suchen, mit welchen ich in eine Textbox eine Formel eingegeben kann und mir das Ergebnis anschließend in ein Label oder in eine Textbox geschrieben wird.

    Der bisherige Code würde ja super funktionieren, wenn ich bloß mit den Kommazahlen rechnen könnte.

    toeller schrieb:

    das ist mir als Anfänger alles viel zu schwierig.
    Ist das schon die richtige Aufgabe für Dich?

    toeller schrieb:

    Ich glaube ich muss mir da im Internet einen fertigen Code suchen,
    Du kopierst Dir irgend Code den Du nicht verstehst in Dein Programm, und dann soll das Programm richtig laufen?
    Glaub mir, an dieser Stelle fangen die Probleme erst richtig an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da gebe ich Dir recht, der gleichen Meinung war und bin ich auch. Mein Chef jedoch meint, das ich das Problem irgendwie lösen soll.


    VB.NET-Quellcode

    1. Private Sub GeländerFormelTextBox_TextChanged(sender As System.Object, e As System.EventArgs) Handles GeländerFormelTextBox.Leave
    2. Dim SC As New MSScriptControl.ScriptControl
    3. SC.Language = "VBScript"
    4. Dim FormelGeländer As String
    5. Dim Muster As String = "^([0.00-9.99\s\-+*/()]+)$" ' Formelstruktur
    6. Dim Regex As New Regex("")
    7. FormelGeländer = GeländerFormelTextBox.Text
    8. If Regex.IsMatch(FormelGeländer, Muster) Then ' Grobe Strukturprüfung
    9. Try
    10. GeländerTextBox.Text = SC.Eval(FormelGeländer) ' Formel berechnen
    11. Catch ex As Exception
    12. MessageBox.Show("Falsche Formelstruktur")
    13. End Try
    14. Else
    15. MessageBox.Show("Formel enthält Fehler")
    16. End If
    17. GeländerTextBox.Text = Format(GeländerTextBox.Text, "Currency") 'damit wird in Währung € formatiert
    18. End Sub



    Ich bin auch bereits einen Schritt weiter gekommen. Jetzt kann ich auch schon rechnen, muss jedoch jetzt statt einem Komma einen Punkt eingeben.

    Wenn ich mit obigen Code z.B. "200.40+200.40" eingebe erscheint das richtige Ergebnis.

    Jetzt muss ich nur noch eine Lösung finden, wie anstatt eines Punktes ein Komma eingeben werden kann.
    Dann konvertiere den String doch vor dem RegEx so, dass die (richtigen) Kommata durch Punkte ersetzt werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So, der Code ist jetzt fertig und erfüllt genau den Zweck den ich benötigt habe. Falsl jemand irgendwann mal den gleichen Code benötigt, hier ist der komplette Code.

    VB.NET-Quellcode

    1. Imports MSScriptControl
    2. Imports System.Text.RegularExpressions
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim SC As New MSScriptControl.ScriptControl
    5. SC.Language = "VBScript"
    6. Dim Formel As String
    7. Dim Muster As String = "^([0.00-9.99\s\-+*/()]+)$" ' Formelstruktur
    8. TextBox1.Text = TextBox1.Text.Replace(",", ".") 'Hiermit kann anstatt dem Punkt ein , eingegeben werden.
    9. 'Formel = "-12 *(4 + 9)" oder
    10. Formel = Textbox1.Text
    11. Dim Regex As New Regex("")
    12. If Regex.IsMatch(Formel, Muster) Then ' Grobe Strukturprüfung
    13. Try
    14. Label1.Text = SC.Eval(Formel) ' Formel berechnen
    15. Catch ex As Exception
    16. MessageBox.Show("Falsche Formelstruktur")
    17. End Try
    18. Else
    19. MessageBox.Show("Formel enthält Fehler")
    20. End If
    21. End Sub
    Dann mach es vielleicht so:

    VB.NET-Quellcode

    1. 'Formel = "-12 *(4 + 9)" oder
    2. Formel = Textbox1.Text.Replace(",", ".") 'Hiermit kann anstatt dem Punkt ein , eingegeben werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!