I was trying to implement the Luhn Formula in Python, here is my code:
import sys
def luhn_check(number):
if number.isdigit():
last_digit = int(str(number)[-1])
reverse_sequence = list(int(d) for d in str(int(number[-2::-1])))
for i in range(0, len(reverse_sequence), 2):
reverse_sequence[i] *= 2
for i in range(len(reverse_sequence)):
if reverse_sequence[i] > 9:
reverse_sequence[i] -= 9
sum_of_digits = 0
for i in range(len(reverse_sequence)):
sum_of_digits += reverse_sequence[i]
result = divmod(sum_of_digits, 10)
if result == last_digit:
print("[VALID] %s" % number)
else:
print("[INVALID] %s" % number)
quit()
print("[ERROR] \" %s \" is not a valid sequence." % number)
quit()
def main():
if len(sys.argv) < 2:
print("Usage: python TLF.py <sequence>")
quit()
luhn_check(sys.argv[1])
if __name__ == '__main__':
main()
But it isn't working properly:
[INVALID] 4532015112830366
[INVALID] 6011514433546201
[INVALID] 6771549495586802
and so on...
But the logic of the code seems OK to me. I followed this workflow:
The Luhn Formula:
Drop the last digit from the number. The last digit is what we want to check against Reverse the numbers
Multiply the digits in odd positions (1, 3, 5, etc.) by 2 and subtract 9 to all any result higher than 9
Add all the numbers together
The check digit (the last number of the card) is the amount that you would need to add to get a multiple of 10 (Modulo 10)
I think the algorithm is not correct.
The second step you need to sum the digits of the products instead of substract 9. Reference: Wikipedia.
In the Wikipedia you have this example:
Result:
The following might help some people to start with the Luhn algorithm in python.
This is the most concise python formula for the Luhn test I have found:
The above function and other Luhn implementations (in different programming languages) are available in https://www.rosettacode.org/wiki/Luhn_test_of_credit_card_numbers .
see this Python recipe
There are some errors in your code:
returns a tuple, you need only modulo, that is use
Second, to check for validity, you don't omit last digit (that is checksum), but include it in computations. Use
And check for result being zero:
Or if you insist on keeping this not needed complexity, check for last digit to be inverse of checksum modulo 10: keep
but use
For a simplier and shorter code, I can give you a reference to my older answer.