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 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;