Τρίτη 9 Νοεμβρίου 2010

Πρόγραμμα για να καθορίζουμε αν μια πιστωτική κάρτα είναι έγκυρη. (Vb.net)

Βρήκα τις προάλλες ένα αλγόριθμο που καθορίζει πότε μια πιστωτική κάρτα είναι έγκυρη.Πρίν αρχίσουμε να σας πώ ότι άλλο είναι μια κάρτα να είναι έγκυρη και άλλο να συνδέεται και σε κάποιο λογαριασμό.Γιαυτό θα πρέπει να ψάξετε σε ένα credit card server γιατί ο παρακάτω κώδικας δέν θα σας βοηθήσει.

Ο αλγόριθμος του Luhn's – όπως λέγετε – προέρχεται απο τον Hans Peter Luhn, επιστήμονα τής IBM. Η διαδικασία δεν είναι ιδιαίτερα δύσκολή.Ας πούμε οτι έχουμε έναν τυχαίο αριθμό κάρτας 3452 4533 2222 9581. Θα δούμε τώρα αν αυτός ο αριθμός είναι έγκυρος. Πρώτα γράφουμε τα ψηφία αναλυτικά και μετά όσα ψηφία έχουν μονή θέση, τα πολλαπλασιάζουμε με το 2.Δηλαδή το πρώτο ψηφίο το τρίτο και πάει λέγοντας.Στο τρίτο βήμα από όσα ψηφία έχουν πάει στο 10 ή το έχουν ξεπεράσει, αφαιρούμε 9.

1      2      3     4    5    6     7    8   9   10   11  12   13    14  15    16      θέση ψηφίων
3 4 5 2 4 5 3 3 2 2 2 2 9 5 8 1
6 4 10 2 8 5 6 3 4 2 4 2 18 5 16 1
6 4 1 2 8 5 6 3 4 2 4 2 9 5 7 1

Στο τελευταίο βήμα πρέπει να προσθέσουμε όλα τα ψηφία.Αν το αποτέλεσμα διαιρείται ακριβός με το 10, σημαίνει ότι ο αριθμός της κάρτας είναι έγκυρος. Εδώ πρέπει να έχουμε σύνολο 69 που δείχνει ότι δέν διαιρείται ακριβός με το 10, άρα η κάρτα δέν ισχύει.
Άν προσθέσουμε ένα στο τελευταίο ψηφίο, το check digit όπως λέγεται, τότε θα πάρουμε σύνολο 70, που μας δίνει έναν έγκυρο αριθμό κάρτας.
Με λίγα λογία αυτή είναι η διεργασία κάθε φορά, απλά εμείς έχουμε έτοιμο τον κώδικα για το πρόγραμμα μας και έτσι δέν χρειάζεται να μπαίνουμε σε λεπτομέρειες.Ο κώδικας είναι ο παρακάτω.
Private Function ValidateLuhn(ByVal value As String) As Boolean
Dim CheckSum As Integer = 0
Dim DoubleFlag As Boolean = (value.Length Mod 2 = 0)
Dim Digit As Char
Dim DigitValue As Integer
For Each Digit In value
DigitValue = Integer.Parse(Digit)
If DoubleFlag Then
DigitValue *= 2
If DigitValue > 9 Then
DigitValue -= 9
End If
End If
CheckSum += DigitValue
DoubleFlag = Not DoubleFlag
Next
Return (CheckSum Mod 10 = 0)
End Function

Ανάλογα λοιπόν αν η validateLuhn() σας δίνει true η false,θα ξέρετε αν η κάρτα είναι έγκυρη η όχι.
Άν θέλετε να μάθετε περισσότερα για τις κάρτες, τότε αρχίστε από το http://www.merriampark.com/anatomycc.htm
Έχω γράψει και ένα μικρό παράδειγμα που μπορείτε να δείτε πώς δουλεύει ο κώδικας.

Κατεβάστε τον κώδικα του παραδείγματος.
 

Copyright © panosdk Design by BTDesigner | Blogger Theme by BTDesigner | Powered by Blogger