none
irgendeine Zahl + z.b.11 RRS feed

  • Frage

  • Plus = txtEingabe.Text.Replace("", "-" + "*" + "/")

    Nun möchte ich dass es dass macht:

    8+8-89+5/5*59+2+5*5+6...................  +8+5+2+5+6

    Wie kann ich nun machen dass es mir bis zum nächsten Sonderzeichen alle zahlen nimmt?

    freundliche Grüsse 

    Noel Schenk

    Freitag, 20. September 2013 13:19

Antworten

  • Wie zum Henker kommst du denn von dem einen auf das andere?

    Also wieso aus ...

    8+8-89+5/5*59+2+5*5+6

    in diese umzuwandlen

    +8+5+2+5+6

    wird, verstehe ich noch ... einfach die Zahlen, vor denen ein + ist aneinander ketten. Aber wieso dann

    7+9*8-5+2/6+4

    in diese

    +9+4

    wird und nicht +9+2+4 ist mir schleierhaft.

    Im Übrigen glaube ich nicht, dass das mit Replace klappen wird. Dafür wäre dann doch eher REGEX gut, oder man nimmt halt eine Schleife:

            Dim TextRein As String = "8+8-89+5/5*59+2+5*5+6"
    
            Dim TextRaus As String = ""
            Dim Pos As Integer = InStr(TextRein, "+")
            Dim Zahlen As String = "0123456789"
            Dim Len As Integer
            Do While Pos > 0
                Len = 0
                Do
                    Len += 1
                Loop Until Pos + Len > TextRein.Length Or InStr(Zahlen, Mid(TextRein, Pos + Len, 1)) = 0
                TextRaus = TextRaus & Mid(TextRein, Pos, Len)
                Pos = InStr(Pos + 1, TextRein, "+")
            Loop
    
                MsgBox(TextRaus)
    Hoffe das hilft dir weiter.

    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Freitag, 20. September 2013 14:10
  • Du willst also nur die Zahlen heraus filtern, die ein Plus vor sich stehen haben.

    Dazu kannst du beispielsweise Regex nutzen. Als Ausdruck dient erstmal folgendes:

    \+\d+

    Das \+ sucht nach einem Plus und das \d+ nach mindestens einer Ziffer. In VB.NET angewendet, kann es so aussehen:

            Dim Input As String = "5459*565646+5464/6464-446+464"
            Dim Matches As MatchCollection = Regex.Matches(Input, "\+\d+")'Vorkommen suchen
            Dim Output As String = ""
            For Each Match As Match In Matches'Alle Vorkommen durchgehen
                Output &= Match.Value'An Ausgabe hängen
            Next

    Kürzer geht es über ein Replace:

    Output = Regex.Replace(Input, "([^\+\d]|^)\d+", "")

    Hier wird nun nach Zahlen gesucht die vor sich kein + und keine Zahl stehen haben. Der Anfang darf es aber auch nicht sein (^). Das |-Zeichen entspricht einem ODER.

    Wenn es sich aber nur auf dieses Suchmuster beschränkt, geht es auch ohne Regex und das in der Regel mit schnellerer Ausführung:

            Dim Input As String = "+8+8-89+5/5*59+2+5*5+632423-32+12412354125"
    
            Dim OutputBuilder As New StringBuilder() 'Ist schneller als das einfacher s &= "xyz"
    
            Dim flag As Boolean = False
            For Each c As Char In Input 'Alle Zeichen durch gehen
                If c = "+"c Then 'Plus-Zeichen
                    flag = True
                    OutputBuilder.Append(c)
                ElseIf "0123456789".Contains(c) And flag Then 'Eine Zahl und hinter einem +
                    OutputBuilder.Append(c)
                Else
                    flag = False 'Zahlenfolge anscheinend zu Ende
                End If
            Next
    
            Dim Output As String = OutputBuilder.ToString()

    Den Sinn bezweifle aber auch ich etwas...

    PS: 12+3/4+2 kann nicht zu 3+2 o.ä. werden. Punkt- vor Strichrechnung! Du musst zuerst das / heraus rechnen. + und - kommen zum Schluss dran.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Freitag, 20. September 2013 14:19
    Moderator

Alle Antworten

  • Hallo Noel

    Kannst Du das evtl. mal etwas genauer beschreiben. Ich zumindest, verstehe nur Bahnhof. :=(

    Gruß Scotty

    Freitag, 20. September 2013 13:31
  • Ja natürlich 

    es sollte eig. so funktionieren:

    Plus = txtEingabe.Text.Replace("","-1" + "*1" + "/1")

    Plus2 = txtEingabe.Text.Replace("",Plus + "-2" + "*2" + "/2")

    Plus3 = txtEingabe.Text.Replace("",Plus2 + "-3" + "*3" + "/3")

    Plus4 = txtEingabe.Text.Replace("", Plus3 + "-4" + "*4" + "/4")

    nun ich möchte natürlich nicht alle zahlen bis ... schreiben deshalb sollte hier eine Funktion hin 


    • Bearbeitet n9s7 Freitag, 20. September 2013 13:37
    Freitag, 20. September 2013 13:36
  • Hallo,
    deine Beschreibung ist nach wie vor sehr mager und deshalb verstehe ich (und wahrscheinlich die meisten Anderen) immer noch nicht.

    Versuche mal dein Vorhaben mit wenigen Sätzen zu beschreiben. Pseudocodes etc helfen natzürlich, aber auch nur dann, wenn man weiß was heraus kommen soll.

    Siehe auch: Goldrichtig: Wie stelle ich eine Frage?


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Freitag, 20. September 2013 13:48
    Moderator
  • Tut mir leid, aber ich kapiere gerade auch nicht, was du eigentlich willst. Vielleicht auch deswegen, weil deine Verwendung von Replace so gar nicht dem entspricht, was man syntaktisch erwarten würde. Könntest du das vielleicht mit klaren Worten beschreiben, ohne falsche Formeln zu verwenden?

    Replace ersetzt immer nur einen String/Char durch einen anderen String/Char. Also aus Hallo (Replace("a","u") wird Hullo. Wenn du Mehrfachersetzungen willst, bleibt dir wohl nicht viel anderes übrig außer einer Schleife. Und ich glaube fast, von REGEX oder komplexerem sollten wir in dem Fall eher absehen. ;-)

    Also vielleicht sowas in der Art:

    Dim Text As String = "irgendwasmit9871324jk//(§&$=?1vielenZeichen"
    
    Dim DasMussWeg As List(Of String) = New List(Of String) From {"%","&","/","§"}
    
    For Each Such As String in DasMussWeg
        Text = Text.Replace(Such, "")
    Next
    
    Msgbox("Ergebnis: " & Text)


    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.


    Freitag, 20. September 2013 13:48
  • Hallo Noel,

    erklär bitte mal was das werden soll. Hier schon mal etwas warum ich Deine Aufrufe nicht verstehe:

    http://msdn.microsoft.com/de-de/library/vstudio/fk49wtc1.aspx

    Gruß Scotty

    Freitag, 20. September 2013 13:51
  • Ja ich denke du hast verstanden was ich möchte.

    Mein ziel ist es diese Zahlenkombination

    8+8-89+5/5*59+2+5*5+6

    in diese umzuwandlen

    +8+5+2+5+6

    oder

    diese

    7+9*8-5+2/6+4

    in diese

    +9+2+4

    nun kann es aber auch vorkommen dass 

    es mehrere zahlen sind also 

    5459*565646+5464/6464-446+464

    in 

    +5464+464

    ---------------------------------------------------------------------

    5459*565646![!+5464!]!/6464-446![!+464!]!

    in 

    ![!+5464!]! ![!+464!]!




    • Bearbeitet n9s7 Freitag, 20. September 2013 14:13
    Freitag, 20. September 2013 13:52
  • Wie zum Henker kommst du denn von dem einen auf das andere?

    Also wieso aus ...

    8+8-89+5/5*59+2+5*5+6

    in diese umzuwandlen

    +8+5+2+5+6

    wird, verstehe ich noch ... einfach die Zahlen, vor denen ein + ist aneinander ketten. Aber wieso dann

    7+9*8-5+2/6+4

    in diese

    +9+4

    wird und nicht +9+2+4 ist mir schleierhaft.

    Im Übrigen glaube ich nicht, dass das mit Replace klappen wird. Dafür wäre dann doch eher REGEX gut, oder man nimmt halt eine Schleife:

            Dim TextRein As String = "8+8-89+5/5*59+2+5*5+6"
    
            Dim TextRaus As String = ""
            Dim Pos As Integer = InStr(TextRein, "+")
            Dim Zahlen As String = "0123456789"
            Dim Len As Integer
            Do While Pos > 0
                Len = 0
                Do
                    Len += 1
                Loop Until Pos + Len > TextRein.Length Or InStr(Zahlen, Mid(TextRein, Pos + Len, 1)) = 0
                TextRaus = TextRaus & Mid(TextRein, Pos, Len)
                Pos = InStr(Pos + 1, TextRein, "+")
            Loop
    
                MsgBox(TextRaus)
    Hoffe das hilft dir weiter.

    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Freitag, 20. September 2013 14:10
  • ja da hatte ich einen fehler :)

    Was bedeutet 

    Len += 1

    • Bearbeitet n9s7 Freitag, 20. September 2013 14:17
    Freitag, 20. September 2013 14:13
  • ja da hatte ich einen fehler :)

    Du willst also alles, wo kein + davorsteht, aus dem String entfernen?

    Nur so gefragt, wo liegt da der Sinn? Bzw. was willst Du damit bezwecken? Die Frage stelle ich, weil es je nach Anforderung evtl. sinnvolle Alternativen gibt, die man in Erwägung ziehen könnte.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 20. September 2013 14:18
    Moderator
  • Du willst also nur die Zahlen heraus filtern, die ein Plus vor sich stehen haben.

    Dazu kannst du beispielsweise Regex nutzen. Als Ausdruck dient erstmal folgendes:

    \+\d+

    Das \+ sucht nach einem Plus und das \d+ nach mindestens einer Ziffer. In VB.NET angewendet, kann es so aussehen:

            Dim Input As String = "5459*565646+5464/6464-446+464"
            Dim Matches As MatchCollection = Regex.Matches(Input, "\+\d+")'Vorkommen suchen
            Dim Output As String = ""
            For Each Match As Match In Matches'Alle Vorkommen durchgehen
                Output &= Match.Value'An Ausgabe hängen
            Next

    Kürzer geht es über ein Replace:

    Output = Regex.Replace(Input, "([^\+\d]|^)\d+", "")

    Hier wird nun nach Zahlen gesucht die vor sich kein + und keine Zahl stehen haben. Der Anfang darf es aber auch nicht sein (^). Das |-Zeichen entspricht einem ODER.

    Wenn es sich aber nur auf dieses Suchmuster beschränkt, geht es auch ohne Regex und das in der Regel mit schnellerer Ausführung:

            Dim Input As String = "+8+8-89+5/5*59+2+5*5+632423-32+12412354125"
    
            Dim OutputBuilder As New StringBuilder() 'Ist schneller als das einfacher s &= "xyz"
    
            Dim flag As Boolean = False
            For Each c As Char In Input 'Alle Zeichen durch gehen
                If c = "+"c Then 'Plus-Zeichen
                    flag = True
                    OutputBuilder.Append(c)
                ElseIf "0123456789".Contains(c) And flag Then 'Eine Zahl und hinter einem +
                    OutputBuilder.Append(c)
                Else
                    flag = False 'Zahlenfolge anscheinend zu Ende
                End If
            Next
    
            Dim Output As String = OutputBuilder.ToString()

    Den Sinn bezweifle aber auch ich etwas...

    PS: 12+3/4+2 kann nicht zu 3+2 o.ä. werden. Punkt- vor Strichrechnung! Du musst zuerst das / heraus rechnen. + und - kommen zum Schluss dran.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Freitag, 20. September 2013 14:19
    Moderator
  • Hallo Noel

    Ungetestet:

    Dim input = "8+8-89+5/5*59+2+5*5+6"
    Dim pattern = "([^+][0-9]+|^[0-9]+)"

    Dim plus = System.Text.RegularExpressions.Regex.Replace(input, pattern, "")

    Gruß Scotty

    Freitag, 20. September 2013 14:21
  • ja es gäbe bestimmt sinnvollere Alternativen allerdings ist dies zu Lernzwecken gedacht. Auch wenn es vielleicht für euch nicht ganz nachvollziehbar ist:

    Ich muss ein Taschenrechner machen der punkt vor strich beachtet und alles in einem Feld ein und ausgegeben wird

    Ps. was bedeutet Len += 1  allso "+="

    freundliche Grüsse

    Noel Schenk

     
    Freitag, 20. September 2013 14:22
  • ja da hatte ich einen fehler :)

    Was bedeutet 

    Len += 1


    Da wird einfach die Länge um 1 erhöht. Ist kürzer als Len = Len + 1

    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Freitag, 20. September 2013 14:23
  • ja es gäbe bestimmt sinnvollere Alternativen allerdings ist dies zu Lernzwecken gedacht. Auch wenn es vielleicht für euch nicht ganz nachvollziehbar ist:

    Ich muss ein Taschenrechner machen der punkt vor strich beachtet und alles in einem Feld ein und ausgegeben wird

    Nuja, damit wirst Du keinen Taschenrechner bauen können. Das im Ausgangsposting gewünschte erreichst Du bspw. hiermit:

    Dim Pattern As String = "\+\d{1,}"
    Dim Result  As String = String.Empty
    Dim Items   As New List( Of String )
        Items.Add( "8+8-89+5/5*59+2+5*5+6" )
        Items.Add( "7+9*8-5+2/6+4" )
        Items.Add( "5459*565646+5464/6464-446+464" )
    
        For Each Item As String In Items
            Result = String.Empty
            For Each Match As Match In Regex.Matches( Item, Pattern )
                Result &= Match.Groups(0).Value
            Next
            If Not String.IsNullOrEmpty( Result ) Then
                TextBox1.AppendText( Result & ControlChars.NewLine )
            End If
        Next


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 20. September 2013 14:47
    Moderator
  • Output = Regex.Replace(Input, "([^\+\d]|^)\d+", "")

    Hallo Denis,

    geht noch kürzer:

    ([^+]|^)\d+

    ;=)

    Gruß Scotty

    Freitag, 20. September 2013 15:01
  • Ich bin Tom, aber egal ;)

    Das \ vor dem + kann man weg lassen, das \d in den eckigen Klammern aber nicht. So würden andere Ergebnisse heraus kommen. Aus +12 würde beispielsweise + werden.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Freitag, 20. September 2013 15:09
    Moderator
  • Danke viel mal für eure Unterstützung ich habe nun einen Teil vom ganzen hinbekommen.

    Ich werde die Lösung anschließend Posten. 

    Freitag, 20. September 2013 15:20
  •                 Do While pos > 0
                        len = 0
                        Do
                            len += 1
                            'Kommentar: Len += 1 entspricht Len = Len + 1
                        Loop Until pos + len > textRein.Length Or InStr(zahlen, Mid(textRein, pos + len, 1)) = 0
                        textRaus = textRaus & Mid(textRein, pos, len)
                        pos = InStr(pos + 1, textRein, "+")
                    Loop

    Tut mir leid aber noch eine Frage wie kann man bei dem code von Dennis auch noch die vorhergehende zahl anzeigen lassen?

    Freitag, 20. September 2013 16:05
  • Hallo Noel,

    so wird das nie was. :=(

    Du kannst nicht einfach nach irgendwelchen Übereinstimmungen suchen und dann versuchen ein sinnvolles Ergebnis zu ermitteln.

    Für solch ein Aufgabe brauchst Du ein Parser der erst einmal Deinen "Input" in Tokens "zerlegt". Hier Operanden und Operatoren. Glaube mir eine nicht wirklich einfach zu lösende Aufgabe, schon gar nicht, wenn man Len += 1 kommentieren muss.

    Ich will Dich nicht demotivieren, aber etwas realisiert man nicht mal in einer Stunde. Ich habe für meinen Parser bestimmt 4 Wochen gebraucht - Gut der kann auch so etwas ausrechnen:

    Eingangsparameter: x=20

    +0.2 * +E - 7.e6 * 7.e-6 / x -Sin(-1234) * -(-45 / -(3 - 4)) - Atan2(5, -6)

    Ergebnis: 22,7335464526111

    Der Grundzug ist immer der Gleiche zerlegen und auswerten.

    Voraussetzung um das richtige in Bestandteile zu zerlegen sin Regular Expression(die auch Tom angesprochen hatte). Sie bieten Dir Flexibilität, sind aber auch nicht von heute auf morgen zu erlernen.

    Überlege Dir wie der Mensch ein Problem angeht, Er hat es schließlich geschaffen. Dann versuch nach und nach die Schritte des Menschen in Dein Programm zu integrieren.

    Wenn Du 1 + 2 * 3 siehst, auf was schaust Du zuerst? Nicht auf die Operanden, sondern auf die Operatoren, immerhin geht's es ja die Rechenregeln einzuhalten - Hier also Punkt- vor Strichrechnung. Wenn Du Operatoren von Operanden getrennt hast, sollte Dir der Shunting-Yard Algorithmus weiterhelfen

    http://de.wikipedia.org/wiki/Shunting-yard-Algorithmus

    Er wandelt Infix in RPN um. Die weitere Verarbeitung fällt damit viel leichter. Probier das mal mit eine Stift und ein Blatt Papier und Du wirst feststellen das Du auf dem Holzwegmit Deinem Lösungsansatz bist.

    Gruß Scotty

    Freitag, 20. September 2013 17:00
  • Hallo Noel,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,
    Ionut


    Ionut Duma, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 27. September 2013 08:23
    Moderator