# Check credit card numbers using the Luhn algorithm

You can find a nice infographic explaining how to understand the credit card number here.

Credit card numbers include, as the last digit, a simple checksum calculated using the Luhn algorithm. In essence, we add up the digits of the card number in a certain way, and if the resulting sum divided by 10 is not an integer (i.e., the reminder of dividing by 10 is zero), then the number is invalid (the reverse is not true; a number divisible by 10 can still be invalid).

This can be easily computed in R, although I suspect that there might be an easier way:

checkLuhn <- function( ccnum ) {

# helper function
sumdigits <- function( x )
sapply( x, function( xx )
sum( as.numeric( unlist( strsplit( as.character( xx ), "" ))))
)
# split the digits
ccnum <- as.character( ccnum )
v <- as.numeric( unlist( strsplit( ccnum, "" ) ) )
v <- rev( v )

# indices of every second digit
i2 <- seq( 2, length( v ), by= 2 )
v[i2] <- v[i2] * 2
v[ v > 9 ] <- sumdigits( v[ v > 9 ] )

if( sum( v ) %% 10 == 0 ) return( TRUE )
else return( FALSE )

}