Überprüfung ob eine Zahl Gerade/Ungerade ist.

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Ok, problem gelöst. Ich habe anstatt das dreifache der geraden Zahlen, das dreifache der ungeraden Zahlen genommen.
    Jedoch ist mir immer noch nicht klar warum dein erster EAN-Code mir noch immer das falsche Ergebnis liefert...

    Dein EAN-CODE: 4029508. Du meinst es ist 4, jedoch ist es 8 ^^
    Und wieso gibt mir dieser Code dann das Ergebnis 6?

    VB.NET-Quellcode

    1. Dim CharArray() As Char = tbxEAN.Text.ToCharArray
    2. Dim Gerade, Ungerade As Integer
    3. For i As Integer = 0 To CharArray.Length - 1
    4. If (Integer.Parse(CharArray(i)) Mod 2 = 0) Then
    5. Gerade += Integer.Parse((CharArray(i)))
    6. Else
    7. Ungerade += Integer.Parse(CharArray(i))
    8. End If
    9. Next
    10. Gerade = Gerade * 3
    11. tbxCHECKDIGIT.Text = CStr((Ungerade + Gerade) Mod 10)
    weil dein Algo inkorrekt ist.

    ErfinderDesRades schrieb:

    9016982 - 3
    komischer EAN8

    müsste sich ja berechnen zu:
    9 + 0 + 1 + 18 + 9 + 24 + 2 = 63
    70 - 63 = 7
    7 ??

    deine EAN8 ist doch ok, ich bin nur auch zu doof, richtig nach wiki oder picoflop vorzugehen:

    Quellcode

    1. 'man muß ja von hinten anfangen
    2. 9016982 - 3
    3. 2 8 9 6 1 0 9
    4. 6 + 8 + 27+ 6 + 3 + 0 + 27 = 77
    5. 80 - 77 = 3

    ErfinderDesRades schrieb:

    picoflop

    Ja, ja, der Papa Schlumpf muss mal wieder ran ...

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. ' compare to: http://www.pruefziffernberechnung.de/E/EAN.shtml
    3. ' online calc: http://www.pruefziffer.de/eantest.php4
    4. Debug.Print(EANCheckDigit(762220000460).ToString)
    5. Debug.Print(EANCheckDigit(123456789123).ToString)
    6. ' http://www.gs1-germany.de/service/pruefziffernrechner/pruefziffernlogik/index_ger.html
    7. Debug.Print(EANCheckDigit(401234512345).ToString) ' output 6 -> qed
    8. End Sub
    9. Private Function EANCheckDigit(ByVal EAN As Long) As Integer
    10. Dim toggle As Boolean = True
    11. Dim summe As Long = 0
    12. While EAN > 0
    13. summe += (EAN Mod 10) * If(toggle, 3, 1)
    14. toggle = Not toggle
    15. EAN \= 10
    16. End While
    17. Return CInt(((((summe \ 10) + 1) * 10) - summe) Mod 10)
    18. End Function


    -> qed !

    BTW: Kleiner Tip eines Barcode-Erfahrenen (ich ;) :( An der "Zahl" kann man nicht erkennen, WELCHER Typ des Codes es ist (EAN, UPC, 3of9 etc). Die Scan-Engine erkennt das an den außen liegenden Strichmustern. NUR mit der Zahl kann man also nie eine gültige Prüfziffer berechnen. Im Zweifel muss man immer wissen, welcher Barcode verwendet wurde, denn nur dann kann man den richtigen Algo wählen!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „picoflop“ ()

    oh - da ist meine Lösung aber sehr anners angelegt:

    VB.NET-Quellcode

    1. Private Function GetCheckSum(ByVal s As String) As Integer
    2. Dim chars = s.Replace(" ", "").ToCharArray
    3. Dim sum = 0
    4. For i = chars.Length - 1 To 0 Step -2
    5. sum += Integer.Parse(chars(i))
    6. Next
    7. sum *= 3
    8. For i = chars.Length - 2 To 0 Step -2
    9. sum += Integer.Parse(chars(i))
    10. Next
    11. sum = sum Mod 10
    12. Return If(sum > 0, 10 - sum, sum)
    13. End Function
    14. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    15. MsgBox(String.Concat("544900009624-1: ", GetCheckSum("544900009624")))
    16. MsgBox(String.Concat("426020388110-3: ", GetCheckSum("426020388110")))
    17. MsgBox(String.Concat("978386063137-9: ", GetCheckSum("978386063137")))
    18. MsgBox(String.Concat("978316148410-0: ", GetCheckSum("978316148410")))
    19. MsgBox(String.Concat("4029508-4: ", GetCheckSum("4029508")))
    20. MsgBox(String.Concat("9016982-3: ", GetCheckSum("9016982")))
    21. End Sub


    Edit: wobeis ja nicht um die Ermittlung der Prüfzahl geht, sondern einfach, um zu checken, ob die ziffernfolge stimmt:

    VB.NET-Quellcode

    1. Private Function EanOk(ByVal s As String) As Boolean
    2. Dim chars = s.Replace(" ", "").ToCharArray
    3. Dim sum = 0
    4. For i = chars.Length - 2 To 0 Step -2
    5. sum += Integer.Parse(chars(i))
    6. Next
    7. sum *= 3
    8. For i = chars.Length - 1 To 0 Step -2
    9. sum += Integer.Parse(chars(i))
    10. Next
    11. Return sum Mod 10 = 0
    12. End Function
    13. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    14. MsgBox(String.Concat("5449000096241 ", EanOk("5449000096241")))
    15. MsgBox(String.Concat("4260203881103 ", EanOk("4260203881103")))
    16. MsgBox(String.Concat("9783860631379 ", EanOk("9783860631379")))
    17. MsgBox(String.Concat("9783161484100 ", EanOk("9783161484100")))
    18. MsgBox(String.Concat("40295084 ", EanOk("40295084")))
    19. MsgBox(String.Concat("90169823 ", EanOk("90169823")))
    20. Me.Close()
    21. End Sub
    22. End Class

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

    ErfinderDesRades schrieb:

    Private Function GetCheckSum(ByVal s As String) As Integer

    Nur wenige Barcodes erlauben alphanumerische Zeichen (zb EAN128), also ist "String" irgendwie ... deplatziert ;)
    Außerdem ist es uncool, das ganze in zwei Schleifen aufzuteilen.
    Nicht vergessen: Das Decoding (Barcode-Engine, s.o.) übernimmt im Normalfall ein ziemlich blöder und billiger Chip. Der Algo kann also nicht sehr komplex sein!

    ErfinderDesRades schrieb:

    also was eingelesen wird, kommt als Tastendrücke im Programm an.

    Das macht im Prinzip jeder "billige" Scanner. Die werden/wurden üblicherweise einfach in die Tastatur eingeschleift (PS/2 Y-Kabel). Heutzutage natürlich vermutlich eher USB und HID. Aber BESSER ist direkter Zugriff per API, da man dann halt auch den Typen des Barcodes erkennt. War mir sehr hilfreich, weil man dadurch zb verschiedene "Objekte" mit verschiedenen Typen unterscheidbar machen kann (Lagerplatz zb Code39, Artikel EAN8, Lieferscheinnummer EAN128). Dann kann man direkt anhand des Barcodes feststellen, WAS gemeint war, selbst wenn jedesmal "123" ankommt.

    btw, revised:

    VB.NET-Quellcode

    1. Private Function EANCheckDigit(ByVal EAN As Long,
    2. Optional ByVal CheckDigitIncluded As Boolean = False) As Integer
    3. Dim toggle As Boolean = True
    4. Dim summe As Long = 0
    5. If CheckDigitIncluded Then EAN \= 10
    6. While EAN > 0
    7. summe += (EAN Mod 10) * If(toggle, 3, 1)
    8. toggle = Not toggle
    9. EAN \= 10
    10. End While
    11. Return CInt((10 - (summe Mod 10)) Mod 10)
    12. End Function


    BTW: Die Engine liefert den Barcode immer OHNE Prüfziffer. Anhand der PZ stellt die Engine ja selbst lediglich fest, ob der Barcode korrekt decodiert wurde. Es macht also keinen Sinn, diese PZ dem "Anwender" als Teil des Barcode mitzuliefern. Verwirrt den nur ;)
    Mein alternativer Vorschlag für dieses Problem:

    VB.NET-Quellcode

    1. ​Public Function isGerade(n As Integer) As Boolean
    2. If n = 0 Then Return True
    3. Dim s As String = n.ToString
    4. If s <> s.TrimEnd("1").TrimEnd("3").TrimEnd("5").TrimEnd("7").TrimEnd("9") Then
    5. Return False
    6. Else
    7. Return True
    8. End If
    9. End Function
    __________________________
    01:
    CLS : SCREEN 12
    02: LINE (0, 20)-(640, 22), 15, BF
    03: ECHO "MFG HASSOWUFF"
    [F5]

    hassowuff schrieb:

    Mein alternativer Vorschlag für dieses Problem:


    Und meiner für dich:

    VB.NET-Quellcode

    1. Public Function IstGerade(n As Integer) As Boolean
    2. Return n Mod 2 = 0
    3. End Function


    Deine Benamung der Funktion ist auch nicht das wahre. Entweder englisch oder deutsch. Schalte auch mal auf Option Strict On um! Extra zum String konvertieren um den zu verarbeiten, ist auch nicht schön.
    Und nebenbei, der letzte Post in diesem Thread ist mehr als 9 Jahre her, wir lassen die alten Threads hier ruhen, graben die nicht erneut aus.
    Genau, daher geschlossen. (Bei weiteren Fragen aber gern einen neuen, eigenen Thread öffnen.) ~Thunderbolt

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Thunderbolt“ ()