- Notifications
You must be signed in to change notification settings - Fork 46.7k
/
Copy pathcredit_card_validator.py
103 lines (87 loc) · 3.43 KB
/
credit_card_validator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
"""
Functions for testing the validity of credit card numbers.
https://en.wikipedia.org/wiki/Luhn_algorithm
"""
defvalidate_initial_digits(credit_card_number: str) ->bool:
"""
Function to validate initial digits of a given credit card number.
>>> valid = "4111111111111111 41111111111111 34 35 37 412345 523456 634567"
>>> all(validate_initial_digits(cc) for cc in valid.split())
True
>>> invalid = "14 25 76 32323 36111111111111"
>>> all(validate_initial_digits(cc) is False for cc in invalid.split())
True
"""
returncredit_card_number.startswith(("34", "35", "37", "4", "5", "6"))
defluhn_validation(credit_card_number: str) ->bool:
"""
Function to luhn algorithm validation for a given credit card number.
>>> luhn_validation('4111111111111111')
True
>>> luhn_validation('36111111111111')
True
>>> luhn_validation('41111111111111')
False
"""
cc_number=credit_card_number
total=0
half_len=len(cc_number) -2
foriinrange(half_len, -1, -2):
# double the value of every second digit
digit=int(cc_number[i])
digit*=2
# If doubling of a number results in a two digit number
# i.e greater than 9(e.g., 6 x 2 = 12),
# then add the digits of the product (e.g., 12: 1 + 2 = 3, 15: 1 + 5 = 6),
# to get a single digit number.
ifdigit>9:
digit%=10
digit+=1
cc_number=cc_number[:i] +str(digit) +cc_number[i+1 :]
total+=digit
# Sum up the remaining digits
foriinrange(len(cc_number) -1, -1, -2):
total+=int(cc_number[i])
returntotal%10==0
defvalidate_credit_card_number(credit_card_number: str) ->bool:
"""
Function to validate the given credit card number.
>>> validate_credit_card_number('4111111111111111')
4111111111111111 is a valid credit card number.
True
>>> validate_credit_card_number('helloworld$')
helloworld$ is an invalid credit card number because it has nonnumerical characters.
False
>>> validate_credit_card_number('32323')
32323 is an invalid credit card number because of its length.
False
>>> validate_credit_card_number('32323323233232332323')
32323323233232332323 is an invalid credit card number because of its length.
False
>>> validate_credit_card_number('36111111111111')
36111111111111 is an invalid credit card number because of its first two digits.
False
>>> validate_credit_card_number('41111111111111')
41111111111111 is an invalid credit card number because it fails the Luhn check.
False
"""
error_message=f"{credit_card_number} is an invalid credit card number because"
ifnotcredit_card_number.isdigit():
print(f"{error_message} it has nonnumerical characters.")
returnFalse
ifnot13<=len(credit_card_number) <=16:
print(f"{error_message} of its length.")
returnFalse
ifnotvalidate_initial_digits(credit_card_number):
print(f"{error_message} of its first two digits.")
returnFalse
ifnotluhn_validation(credit_card_number):
print(f"{error_message} it fails the Luhn check.")
returnFalse
print(f"{credit_card_number} is a valid credit card number.")
returnTrue
if__name__=="__main__":
importdoctest
doctest.testmod()
validate_credit_card_number("4111111111111111")
validate_credit_card_number("32323")