equal
deleted
inserted
replaced
|
1 """ |
|
2 Common checksum routines (used in multiple localflavor/ cases, for example). |
|
3 """ |
|
4 |
|
5 __all__ = ['luhn',] |
|
6 |
|
7 LUHN_ODD_LOOKUP = (0, 2, 4, 6, 8, 1, 3, 5, 7, 9) # sum_of_digits(index * 2) |
|
8 |
|
9 def luhn(candidate): |
|
10 """ |
|
11 Checks a candidate number for validity according to the Luhn |
|
12 algorithm (used in validation of, for example, credit cards). |
|
13 Both numeric and string candidates are accepted. |
|
14 """ |
|
15 if not isinstance(candidate, basestring): |
|
16 candidate = str(candidate) |
|
17 try: |
|
18 evens = sum([int(c) for c in candidate[-1::-2]]) |
|
19 odds = sum([LUHN_ODD_LOOKUP[int(c)] for c in candidate[-2::-2]]) |
|
20 return ((evens + odds) % 10 == 0) |
|
21 except ValueError: # Raised if an int conversion fails |
|
22 return False |