Vergleichen von einzelnen Ziffern innerhalb einer Zahl

  • VB.NET

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

    Vergleichen von einzelnen Ziffern innerhalb einer Zahl

    Hallo Leute,

    Gibt es eine Funktion um einzelne Ziffern in einer Zahl zu vergleichen? Ich möchte Zahlen, welche gleiche Ziffern enthalten aus dem DGV löschen.

    z.B:
    2310 --> ok
    3405 --> ok
    4034 --> löschen (da die Ziffer 4 mehrmals vorkommt)
    3330 --> löschen
    3459 --> ok

    Ich hoffe ihr versteht was ich meine.

    Aktuell ist jede Ziffer in einem DGV in einer einzelnen Spalte, dass heisst getrennt und noch nicht als ganze Zahl.

    Angewendet am Beispiel oben:
    2310
    3405
    4034
    3330
    3459


    Danke für eure Hilfe.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DusMil“ ()

    Hier mal umgesetzt mit 2 Textboxen. Wie man sieht vergleiche ich Strings.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. TextBox2.Text = ""
    3. If CharacterRepetition(TextBox1.Text) Then
    4. TextBox2.Text = "löschen"
    5. Else
    6. TextBox2.Text = "OK"
    7. End If
    8. End Sub
    9. Private Shared Function CharacterRepetition(ByVal value As String) As Boolean
    10. Dim fval As Boolean = False
    11. For i As Integer = 0 To value.Length - 1
    12. If CountChars(value, value(i)) > 1 Then
    13. fval = True
    14. Exit For
    15. End If
    16. Next
    17. Return fval
    18. End Function
    19. Public Shared Function CountChars(ByVal value As String, ByVal charToCount As Char) As Integer
    20. Return value.ToCharArray().Count(Function(c) c = charToCount)
    21. End Function


    Edit: @VB1963 Funktion ist weitaus genialer.
    Danke euch beiden... es funktioniert!

    Ich habe noch eine kleine Ergänzung:
    Ist es möglich, dass die 0 als doppelter Wert zugelassen wird?
    124OK
    034OK
    001OK (trotz dem doppelten Wert 0)
    022Löschen (da 2 mehr als einmal vorkommt)
    330Löschen (da 3 mehr als einmal vorkommt)
    200OK (trotz dem doppelten Wert 0)

    Also es sollen keine doppelten Werte ausser die 0 zugelassen werden.
    Wenn es Zahlen sind, versuchs mal mit dem

    Freundliche Grüsse

    exc-jdbi

    EDIT: Mit Beachtung der 0-len

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Module Module1
    4. Private Rand As New Random
    5. Public Sub Main()
    6. Dim nums = GetRngNumbers(1000)
    7. Dim res = Eliminate(nums)
    8. Stop
    9. End Sub
    10. Private Function Eliminate(numbers() As Int32) As Int32()
    11. If numbers IsNot Nothing AndAlso numbers.Length > 0 Then
    12. Dim isok As Boolean
    13. Dim nums() As Int32
    14. Dim res As New List(Of Int32)
    15. For Each num As Int32 In numbers
    16. isok = True
    17. nums = GetDigits(num)
    18. For Each n As Int32 In nums
    19. If n = 0 Then Continue For
    20. If nums.Count(Function(x) x = n) > 1 Then
    21. isok = False : Exit For
    22. End If
    23. Next
    24. If isok Then res.Add(num)
    25. Next
    26. Return res.ToArray
    27. End If
    28. Return Nothing
    29. End Function
    30. Private Function GetDigits(number As Int32) As Int32()
    31. If number = 0 Then Return {0}
    32. Dim base = 10I
    33. Dim digitlen = DigitsLen(number)
    34. Dim res = New Int32(digitlen - 1) {}
    35. For i As Int32 = 0 To digitlen - 1
    36. res(i) = CInt(Math.Truncate((number / (base ^ i)) Mod base))
    37. Next
    38. Return res.Reverse.ToArray
    39. End Function
    40. Private Function GetRngNumbers(size As Int32) As Int32()
    41. Return Enumerable.Range(0, size).Select(Function(x) Rand.Next()).ToArray
    42. End Function
    43. Private Function DigitsLen(number As Int32) As Int32
    44. Return CInt(Math.Truncate(Math.Log10(number)) + 1I)
    45. End Function
    46. End Module

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    DusMil schrieb:

    Das funktioniert leider nicht...
    Wie äußert sich das?
    Bitte immer eine präzise Effekt- oder Fehlerbeschreibung posten.
    @VB1963 nen String, keinen Char ersetzen.
    Probierma (ohne c)

    VB.NET-Quellcode

    1. Dim strNumber = "12036590".Replace("0", "")

    ====
    Also bei mir funktioniert das mit und ohne c.
    DusMil poste ein Beispiel, wo das nicht klappt.
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Text.RegularExpressions
    3. Module Module1
    4. Sub Main()
    5. Dim ergebnis As Boolean
    6. Dim t As String() = {"12345", "4711", "4812", "007", "122987", "10000089"}
    7. For i = 0 To t.Length - 1
    8. ergebnis = Regex.IsMatch(t(i), "([1-9])[0-9]*\1")
    9. If ergebnis = False Then
    10. Debug.Print(t(i) & " ---> " & "OK")
    11. Else
    12. Debug.Print(t(i) & " ---> " & "Löschen")
    13. End If
    14. Next
    15. End Sub
    16. End Module
    Gefällt mir @Eierlein

    Hier eine andere String-Variante, wobei die Zahlen wieder als Integer vorhanden sind.
    Man kann die ja problemlos auch als Strings führen.

    Eine Mischung aus dem schon hier gesagtem und dem von mir vorher vorgeschlagenem.

    Freundliche Grüsse

    exc-jdbi


    VB.NET-Quellcode

    1. Private Sub Beispiel2_StringVariante()
    2. Dim res = New List(Of String)
    3. Dim nums = GetRngNumbers(100).ToList
    4. nums.ForEach(Sub(x)
    5. Dim numb = x.ToString.Trim.Replace("0"c, "")
    6. If numb.Length = numb.Distinct.Count Then
    7. res.Add(x.ToString.Trim)
    8. End If
    9. End Sub)
    10. Stop
    11. End Sub
    12. Private Function GetRngNumbers(size As Int32) As Int32()
    13. Return Enumerable.Range(0, size).Select(Function(x) Rand.Next()).ToArray
    14. End Function

    VB.NET-Quellcode

    1. Private Sub Beispiel3_StringVariante()
    2. Dim res = New List(Of Boolean)
    3. Dim nums = GetRngNumbersStr(100).ToList
    4. nums.ForEach(Sub(s)
    5. Dim snumb = s.Replace("0"c, "")
    6. res.Add(If(snumb.Length = snumb.Distinct.Count, True, False))
    7. End Sub)
    8. Stop
    9. End Sub
    10. Private Function GetRngNumbersStr(size As Int32) As String()
    11. Return Enumerable.Range(0, size).Select(Function(x) Rand.Next.ToString.Trim).ToArray
    12. End Function


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Super, Leute ! :thumbsup:
    Der TE wird sich jetzt eine eurer Lösungen kopieren, aber so gut wie nichts gelernt haben,
    außer daß man hier gut code schnorren kann !
    Dies ist ein typische code-schnorrer Thread, mich wundert echt, daß es scheinbar niemandem auffällt.

    * Zitate entfernt * ~NoFear23m

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    @VB1963 Jou, hatte ich schon in Post #13 nachgereicht.
    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!