'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *' '* This program verifies the accuracy and validity of cards *' '* from American Express, Visa, MasterCard, Discovery, JCB, *' '* Australian BankCard, Carte Blanche, and Diners Club using *' '* the MOD 10 Algorithm of Davis Paris and Aries Solis. *' '* *' '* Written by Zsolt Nagy Perge in November 2000. *' '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *' DEFINT A-Z '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *' CONST MINLEN = 10 ' minimum card length CONST MAXLEN = 30 ' maximum card length '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *' '* MAIN PROGRAM *' '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *' Main: CLS PRINT PRINT "This program checks credit card numbers to make sure they are valid." PRINT PRINT "Enter card number to verify : "; LINE INPUT NUMBER$ PRINT ' INITIAL CARD NUMBER CHECKING ' Don't waste time... NLEN = LEN(NUMBER$) IF NLEN > MAXLEN THEN PRINT "Card number is too long." SYSTEM ELSEIF NLEN < MINLEN THEN PRINT "Card number is too short." SYSTEM END IF ' Filter out non-numeric characters. FOR I = 1 TO NLEN C$ = MID$(NUMBER$, I, 1) IF C$ >= "0" AND C$ <= "9" THEN N$ = N$ + C$ ELSEIF NOT C$ = "-" THEN PRINT "Card number may not contain non-numeric characters." SYSTEM END IF NEXT I ' Let CODE equal to the first 4 digits. NUMBER$ = N$ NLEN = LEN(NUMBER$) CODE$ = MID$(NUMBER$, 1, 4) CODE = VAL(CODE$) PRINT "CARD NUMBER: " + NUMBER$ + " (" + LTRIM$(STR$(NLEN)) + " digits)" PRINT "CODE: " + CODE$ + " - "; ' CARD IDENTIFICATION ' Select card type and length based on the first 4 digits. IF CODE >= 3400 AND CODE <= 3499 OR CODE >= 3700 AND CODE <= 3799 THEN CNAME$ = "American Express" CLEN = 15 ELSEIF CODE >= 5100 AND CODE <= 5599 THEN CNAME$ = "MasterCard" CLEN = 16 ELSEIF CODE >= 4000 AND CODE <= 4999 THEN IF NLEN = 14 THEN PRINT "Visa card number must be either 13 or 16 digits long." SYSTEM ELSE CNAME$ = "Visa" IF NLEN < 14 THEN CLEN = 13 ELSE CLEN = 16 END IF ELSEIF CODE = 6011 THEN CNAME$ = "Discovery" CLEN = 16 ELSEIF CODE = 5610 THEN CNAME$ = "Australian BankCard" CLEN = 16 ELSEIF CODE = 2131 OR CODE = 1800 THEN CNAME$ = "JCB" CLEN = 15 ELSEIF CODE >= 2528 AND CODE <= 3589 THEN CNAME$ = "JCB" CLEN = 16 ELSEIF CODE >= 3000 AND CODE <= 3059 OR CODE >= 3600 AND CODE <= 3699 OR CODE >= 3800 AND CODE <= 3889 THEN CNAME$ = "Diners Club" CLEN = 14 ELSEIF CODE >= 3890 AND CODE <= 3899 THEN CNAME$ = "Carte Blanche" CLEN = 14 ELSE PRINT "Unknown card type." SYSTEM END IF PRINT CNAME$ + " (" + LTRIM$(STR$(CLEN)) + " digits required) - "; ' Check card number length. I = NLEN - CLEN IF I > 0 THEN PRINT "Card number is too long." SYSTEM ELSEIF I < 0 THEN PRINT "Card number is too short." SYSTEM END IF PRINT "OK." ' CALCULATING CHECKSUM ' Add up the value of alternate digits ' beginning with the first digit from the right. FOR I = NLEN TO 1 STEP -2 CHKSUM = CHKSUM + VAL(MID$(NUMBER$, I, 1)) NEXT I ' Double the value of alternate digits ' beginning with the second digit from the right. FOR I = NLEN - 1 TO 1 STEP -2 DIGIT = VAL(MID$(NUMBER$, I, 1)) * 2 IF DIGIT < 10 THEN CHKSUM = CHKSUM + DIGIT ELSE CHKSUM = CHKSUM + DIGIT - 9 END IF NEXT I PRINT "CHECKSUM:"; CHKSUM IF CHKSUM MOD 10 THEN PRINT "This card number is invalid." ELSE PRINT "This card number is valid." END IF END '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'