The only card type I didn't convert was the "switch" type. If someone knows what this regular expression is doing: ^6(3(33[0-4][0-9])|759[0-9]{2})\d{10}(\d{2,3})?$
then I could add that as well. (I don't know Regular Expressions well enough just yet).
By the way, this was just done for something fun to do, so the code can probably be optimized quite a bit. I'm still new to Purebasic.
Code: Select all
; Reference: http://www.beachnet.com/~hstiles/cardtype.html
; # Returns a string containing the type of card from the list of known information below.
; # == Known card types
; # *Card Type* *Prefix* *Length*
; # mastercard 51-55 16
; # visa 4 13, 16
; # american_express 34, 37 15
; # diners_club 300-305, 36, 38 14
; # enroute 2014, 2149 15
; # discover 6011 16
; # jcb 3 16
; # jcb 2131, 1800 15
; # bankcard 5610, 56022[1-5] 16
; # solo 63, 6767 16,18,19
; Determines the Credit Card type
Procedure.s CreditCardType(CardNumber.s)
If Mid(CardNumber, 1, 1) = "4" And (Len(CardNumber) = 13 Or Len(CardNumber) = 16)
ProcedureReturn "visa"
ElseIf (Mid(CardNumber, 1, 1) = "3" And Len(cardNumber) = 16) Or ((Mid(CardNumber, 1, 4) = "2131" Or Mid(CardNumber, 1, 4) = "1800") And Len(CardNumber) = 15)
ProcedureReturn "jcb"
ElseIf Val(Mid(CardNumber, 1, 2)) >= 51 And Val(Mid(CardNumber, 1, 2)) <= 55 And Len(CardNumber) = 16
ProcedureReturn "mastercard"
ElseIf (Mid(CardNumber, 1, 2) = "34" Or Mid(CardNumber, 1, 2) = "37") And Len(CardNumber) = 15
ProcedureReturn "american_express"
ElseIf (Mid(CardNumber, 1, 2) = "36" Or Mid(CardNumber, 1, 2) = "38" Or (Val(Mid(CardNumber, 1, 3)) >= 300 And Val(Mid(CardNumber, 1, 3)) <= 305)) And Len(CardNumber) = 14
ProcedureReturn "diners_club"
ElseIf (Mid(CardNumber, 1, 4) = "2014" Or Mid(CardNumber, 1, 4) = "2149") And Len(CardNumber) = 15
ProcedureReturn "enroute"
ElseIf Mid(CardNumber, 1, 4) = "6011" And Len(CardNumber) = 16
ProcedureReturn "discover"
ElseIf (Mid(CardNumber, 1, 4) = "5610" Or (Val(Mid(CardNumber, 1, 6)) >= 560221 And Val(Mid(CardNumber, 1, 6)) <= 560225)) And Len(CardNumber) = 16
ProcedureReturn "bankcard"
ElseIf (Mid(CardNumber, 1, 2) = "63" Or Mid(CardNumber, 1, 4) = "6767") And (Len(CardNumber) = 16 Or Len(CardNumber) = 18 Or Len(CardNumber) = 19)
ProcedureReturn "solo"
EndIf
ProcedureReturn "Invalid Card Type"
EndProcedure
; Checks if the Credit Card Number is valid or not
Procedure.l ValidCreditCard(CardNumber.s)
sum.l = 0
major.l = 0
minor.l = 0
If Len(CardNumber) > 0
; Loop through the individual digits in the number - in reverse order
For tmp = Len(CardNumber) To 1 Step -1
If tmp%2 = 0 ; Is this an ODD number
sum+Val(Mid(CardNumber, tmp, 1))
Else ; Must be an EVEN number
minor = Val(Mid(CardNumber, tmp, 1)) * 2
If minor > 10
minor = minor%10
major = 1 ; Can never be more than this
Else
major = 0
EndIf
sum+major+minor
EndIf
Next
If sum%10 = 0
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
EndProcedure
Debug CreditCardType("4574602227004976")
Debug "True = " + Str(#True)
Debug "False = " + Str(#False)
Debug "Valid = " + Str(ValidCreditCard("4574602227004976"))
Debug "Valid = " + Str(ValidCreditCard(StrQ(4574602227004976)))