78 lines
2 KiB
Text
78 lines
2 KiB
Text
' version 27-10-2016
|
|
' compile with: fbc -s console
|
|
|
|
#Ifndef TRUE ' define true and false for older freebasic versions
|
|
#Define FALSE 0
|
|
#Define TRUE Not FALSE
|
|
#EndIf
|
|
|
|
Function luhntest(cardnr As String) As Long
|
|
|
|
cardnr = Trim(cardnr) ' remove spaces
|
|
|
|
Dim As String reverse_nr = cardnr
|
|
Dim As Long i, j, s1, s2, l = Len(cardnr) -1
|
|
|
|
' reverse string
|
|
For i = 0 To l
|
|
reverse_nr[i] = cardnr[l - i]
|
|
Next
|
|
' sum odd numbers
|
|
For i = 0 To l Step 2
|
|
s1 = s1 + (reverse_nr[i] - Asc("0"))
|
|
Next
|
|
' sum even numbers
|
|
For i = 1 To l Step 2
|
|
j = reverse_nr[i] - Asc("0")
|
|
j = j * 2
|
|
If j > 9 Then j = j Mod 10 +1
|
|
s2 = s2 + j
|
|
Next
|
|
|
|
If (s1 + s2) Mod 10 = 0 Then
|
|
Return TRUE
|
|
Else
|
|
Return FALSE
|
|
End If
|
|
|
|
End Function
|
|
|
|
' ------=< MAIN >=-----
|
|
|
|
Dim As String test_str
|
|
Dim As String test_set(1 To ...) = { "US0378331005", "US0373831005", _
|
|
"U50378331005", "US03378331005", "AU0000XVGZA3", _
|
|
"AU0000VXGZA3", "FR0000988040" }
|
|
|
|
Dim As Long i, l, n, x
|
|
|
|
For i = 1 To UBound(test_set)
|
|
test_str = ""
|
|
l = Len(test_set(i))
|
|
If l <> 12 Then
|
|
Print test_set(i), "Invalid, length <> 12 char."
|
|
Continue For
|
|
End If
|
|
If test_set(i)[0] < Asc("A") Or test_set(i)[1] < Asc("A") Then
|
|
Print test_set(i), "Invalid, number needs to start with 2 characters"
|
|
Continue For
|
|
End If
|
|
For n = 0 To l -1
|
|
x = test_set(i)[n] - Asc("0")
|
|
' if test_set(i)[i] is a letter we to correct for that
|
|
If x > 9 Then x = x -7
|
|
If x < 10 Then
|
|
test_str = test_str + Str(x)
|
|
Else ' two digest number
|
|
test_str = test_str + Str(x \ 10) + Str(x Mod 10)
|
|
End If
|
|
Next
|
|
Print test_set(i), IIf(luhntest(test_str) = TRUE, "Valid","Invalid, checksum error")
|
|
Next
|
|
|
|
|
|
' empty keyboard buffer
|
|
While InKey <> "" : Wend
|
|
Print : Print "hit any key to end program"
|
|
Sleep
|
|
End
|