Source code for wheezy.core.luhn

""" ``luhn`` module.
"""


def luhn_checksum(n):
[docs] """ Calculates checksum based on Luhn algorithm, also known as the "modulus 10" algorithm. see http://en.wikipedia.org/wiki/Luhn_algorithm >>> luhn_checksum(1788827948) 0 >>> luhn_checksum(573852158) 1 >>> luhn_checksum(123456789) 7 """ digits = digits_of(n) checksum = (sum(digits[-2::-2]) + sum(sum2digits(d << 1) for d in digits[-1::-2])) % 10 return checksum and 10 - checksum or 0 def luhn_sign(n):
[docs] """ Signs given number by Luhn checksum. >>> luhn_sign(78482748) 784827487 >>> luhn_sign(47380210) 473802106 >>> luhn_sign(123456789) 1234567897 """ return luhn_checksum(n) + (n << 3) + (n << 1) def is_luhn_valid(n):
[docs] """ >>> is_luhn_valid(1234567897) True >>> is_luhn_valid(473802106) True >>> is_luhn_valid(34518893) False """ digits = digits_of(n) checksum = sum(digits[-1::-2]) + sum(sum2digits(d << 1) for d in digits[-2::-2]) return checksum % 10 == 0 def digits_of(n):
[docs] """ Returns a list of all digits from given number. >>> digits_of(123456789) [1, 2, 3, 4, 5, 6, 7, 8, 9] """ return [int(d) for d in str(n)] def sum2digits(d):
[docs] """ Sum digits of a number that is less or equal 18. >>> sum2digits(2) 2 >>> sum2digits(17) 8 """ return (d // 10) + (d % 10)