Python Script: Validating Credit Card Number - Luhn's Algorithm
Anurag Rana
Posted on July 2, 2019
This article was originally published at PythonCircle.com.
The Luhn algorithm, also known as the "modulus 10" algorithm, is a checksum formula used to validate a variety of identification numbers, such as credit card numbers, IMEI numbers, National Provider Identifier numbers in the United States, Canadian Social Insurance Numbers, and Israel ID Numbers.
Algorithm:
The formula verifies a number against its included check digit, which is usually appended to a partial account number to generate the full account number.
Generating check digit:
- Lets assume you have a number as: 3 - 7 - 5 - 6 - 2 - 1 - 9 - 8 - 6 - 7 - X where X is the check digit.
- Now starting from the rightmost digit i.e. check digit, double every second digit. New number will be: 3 - 14 - 5 - 12 - 2 - 2 - 9 - 16 - 6 - 14 - X
- Now if double of a digit is more then 9, add the digits. So the number will become: 3 - 5 - 5 - 3 - 2 - 2 - 9 - 7 - 6 - 5 - X
- Now add all digits. 47 + X
- Multiply the non-check part by 9. So it will be 47 * 9 = 423
- The unit digit in the multiplication result is the check digit. X = 3
- The valid number would be 37562198673.
Validating the generated number:
You can use tools available online to validate that the number generated is valid as per Luhn's algorithm or not. You can validate the number by visiting this site.
Python Script to validate credit card number:
"""
Python script to check the validity of credit card numbers
Author : PythonCircle.Com
Read more : https://www.pythoncircle.com/post/485/python-script-8-validating-credit-card-number-luhns-algorithm/
"""
import sys
def usage():
msg = """
usage:
python3 credit_card_validator credit_card_number
example:
python3 credit_card_validator 34678253793
"""
print(msg)
def get_cc_number():
if len(sys.argv) < 2:
usage()
sys.exit(1)
return sys.argv[1]
def sum_digits(digit):
if digit < 10:
return digit
else:
sum = (digit % 10) + (digit // 10)
return sum
def validate(cc_num):
# reverse the credit card number
cc_num = cc_num[::-1]
# convert to integer list
cc_num = [int(x) for x in cc_num]
# double every second digit
doubled_second_digit_list = list()
digits = list(enumerate(cc_num, start=1))
for index, digit in digits:
if index % 2 == 0:
doubled_second_digit_list.append(digit * 2)
else:
doubled_second_digit_list.append(digit)
# add the digits if any number is more than 9
doubled_second_digit_list = [sum_digits(x) for x in doubled_second_digit_list]
# sum all digits
sum_of_digits = sum(doubled_second_digit_list)
# return True or False
return sum_of_digits % 10 == 0
if __name__ == "__main__":
print(validate(get_cc_number()))
Code is available on Github.
More from PythonCircle.com:
Posted on July 2, 2019
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 30, 2024