{ >I only have one credit card, a visa, and the code works right for it. >So I'm sending this to the list for two purposes, to share this with >everyone and to get anybody else who finds it useful to take a look at >it and see if it's running right for other card types (and to catch any >dumb mistakes I've committed). Your code is probably working fine, I didn't look at it, but I thought I'd post you some code I've used in applications since Turbo Pascal 3.0 and it's worked like a champ... although a little dated in structure. It also returns the card type--Visa, MC, Amex or Discover. } FUNCTION VALIDCCARD(A:STRING):BOOLEAN; VAR C:CHAR; T:WORD; X,M,N:BYTE; BEGIN VALIDCCARD:=FALSE; A:=NUMBERS(A); IF A[0]<#4 THEN EXIT; C:=A[LENGTH(A)]; DEC(A[0]); M:=2; T:=0; FOR X:=LENGTH(A) DOWNTO 1 DO BEGIN N:=(BYTE(A[X])-48); N:=N*M; IF N>9 THEN BEGIN N:=N-10; INC(T); END; T:=T+N; M:=3-M; END; T:=(TRUNC((T+9)/10)*10)-T; IF T=(BYTE(C)-48) THEN VALIDCCARD:=TRUE; END; FUNCTION NUMBERS(C:STRING):STRING; VAR A:STRING; X:INTEGER; BEGIN {strips out all non-numeric digits from a string} A:=''; IF LENGTH(C)>0 THEN FOR X:=1 TO LENGTH(C) DO IF C[X] IN ['0'..'9'] THEN A:=A+C[X]; NUMBERS:=A; END; FUNCTION VALOF(CONST A:STRING):LONGINT; VAR I:INTEGER; L:COMP; BEGIN {guarantee no crash VAL function} VAL(A,L,I); IF I<>0 THEN L:=0; IF L>HIGH(LONGINT) THEN L:=HIGH(LONGINT); IF L=510000) AND (W<=559999) AND (BYTE(A[0])=16) THEN CCARDTYPE:=2 {Mastercard} ELSE IF (W>=400000) AND (W<=499999) AND (BYTE(A[0])=13) THEN CCARDTYPE:=1 {VISA} ELSE IF (W>=400000) AND (W<=499999) AND (BYTE(A[0])=16) THEN CCARDTYPE:=1 {VISA} ELSE IF (W>=340000) AND (W<=349999) AND (BYTE(A[0])=15) THEN CCARDTYPE:=3 {American Express} ELSE IF (W>=370000) AND (W<=379999) AND (BYTE(A[0])=15) THEN CCARDTYPE:=3 {American Express} ELSE IF (W>=601100) AND (W<=601199) AND (BYTE(A[0])=16) THEN CCARDTYPE:=4 {Discover} ELSE CCARDTYPE:=5;{Unknown type} END ELSE CCARDTYPE:=0; END;