Validating a credit card number (the check sum bit, I mean. The having sufficient credit part you need to figure out yourself.) is a really simple process. You can practically do it in your head.

For example:

  • 4111 1111 1111 1111
  • 1111 1111 1111 1114
  • 1212 1212 1212 1218
  • 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 8 = 30
  • 30 mod 10 = 0

Here's a little perl subroutine to do it for ya. Returns 1 for valid and 0 for invalid.

    sub is_valid_cc {
        my $cc = shift() || return 0;
     
        my @digits = reverse split( '', $cc );       # reverse the digits
        for ($i=0; $i < scalar(@digits); $i++) {                          
            $digits[$i] *= ($i%2) ? 2 : 1;           # double the evens
        }
        my $string = join( '', @digits );            # recombine into a string

        my $sum = 0;
        foreach ( split( '', $string ) ) {           # add the digits
            $sum += $_;
        }
         
        return ($sum % 10) ? 0 : 1;
    }                              


heropsychodreamer : the reason you can't just double the odd digits is that that algorithm will break if the credit card number has an odd number of digits (like American Express and old Visa credit cards).

Log in or register to write something here or to contact authors.