Skip to content

Instantly share code, notes, and snippets.

@christian-oudard
Created February 8, 2012 21:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save christian-oudard/1773914 to your computer and use it in GitHub Desktop.
Save christian-oudard/1773914 to your computer and use it in GitHub Desktop.
Luhn validation algorithm for credit cards.
"""
Python implementation of the Luhn algorithm.
Refer to: http://en.wikipedia.org/wiki/Luhn_algorithm
>>> is_luhn_valid(79927398713)
True
>>> is_luhn_valid(79927398714)
False
>>> is_luhn_valid(4532990475689429)
True
>>> is_luhn_valid(4532990475689420)
False
>>> is_luhn_valid(4556278174544876)
True
>>> is_luhn_valid(4556278174544871)
False
>>> is_luhn_valid(5325806143405717)
True
>>> is_luhn_valid(5325806143405712)
False
>>> is_luhn_valid(5459209022644894)
True
>>> is_luhn_valid(5459209022644895)
False
>>> calculate_luhn(7992739871)
3
>>> calculate_luhn(453299047568942)
9
>>> calculate_luhn(455627817454487)
6
>>> calculate_luhn(532580614340571)
7
>>> calculate_luhn(545920902264489)
4
"""
def luhn_checksum(card_number):
def digits_of(n):
return [int(d) for d in str(n)]
digits = digits_of(card_number)
odd_digits = digits[-1::-2]
even_digits = digits[-2::-2]
checksum = 0
checksum += sum(odd_digits)
for d in even_digits:
checksum += sum(digits_of(d*2))
return checksum % 10
def is_luhn_valid(card_number):
return luhn_checksum(card_number) == 0
def calculate_luhn(partial_card_number):
return 10 - luhn_checksum(int(partial_card_number) * 10)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment