Contributor: KEITH ANDERSON
{>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 I0 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;


AltStyle によって変換されたページ (->オリジナル) /