Created
July 5, 2024 01:31
-
-
Save hihumikan/85bcc0412e8994dcdafdfea5dd06757f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Issue2: | |
# カードの種類 | |
cardBrand = {"4": 'Visa', "5": 'Mastercard', "35": 'JCB', | |
"37": 'American Express', "34": 'American Express', "36": 'Diners Club'} | |
cardBrandLength = {"Visa": 16, "Mastercard": 16, "JCB": 16, | |
"American Express": 15, "Diners Club": 14} | |
def __init__(self): | |
self.myCardBrand = "" | |
def isValidCreditCardNumber(self, cardNumber: str) -> bool: | |
"""_summary_ | |
クレジットカード番号 cardNumber のバリデーション | |
Args: | |
cardNumber (int): _description_ | |
Returns: | |
bool: _description_ | |
""" | |
# カードブランドの取得 | |
self.myCardBrand = self.getCardBrand(cardNumber) | |
if self.myCardBrand == False: | |
return False | |
# カード番号の桁数のバリデーション | |
if self.isValidNumber(cardNumber) == False: | |
return False | |
# Luhnアルゴリズムのチェック | |
if self.checkLnhn(cardNumber) == False: | |
return False | |
return True | |
def getCardBrand(self, cardNumber: str) -> str: | |
"""_summary_ | |
カードブランドの取得 | |
self.myCardBrand にセットする | |
Args: | |
cardNumber (str): _description_ | |
Returns: | |
str: _description_ | |
""" | |
if cardNumber[0] in self.cardBrand: | |
return self.cardBrand[cardNumber[0]] | |
elif cardNumber[0:2] in self.cardBrand: | |
return self.cardBrand[cardNumber[0:2]] | |
else: | |
return False | |
def isValidNumber(self, cardNumber: str) -> bool: | |
"""_summary_ | |
カード番号の桁数のバリデーション | |
Args: | |
cardNumber (str): _description_ | |
Returns: | |
bool: _description_ | |
""" | |
if len(cardNumber) == self.cardBrandLength[self.myCardBrand]: | |
return True | |
else: | |
return False | |
def checkLnhn(self, cardNumber: str) -> bool: | |
"""_summary_ | |
Luhnアルゴリズムのチェック | |
Args: | |
cardNumber (str): _description_ | |
Returns: | |
bool: _description_ | |
""" | |
# カード番号を逆順にする | |
cardNumberlist = list(cardNumber[::-1]) | |
# 左端のチェックディジットを1番目として、偶数番目の値を2倍にする | |
cardNumberlist[1::2] = [str(int(i) * 2) for i in cardNumberlist[1::2]] | |
# リスト内の文字列が2桁の場合は、それぞれを別の数字を足す | |
for i in range(len(cardNumberlist)): | |
if len(cardNumberlist[i]) == 2: | |
cardNumberlist[i] = str( | |
int(cardNumberlist[i][0]) + int(cardNumberlist[i][1])) | |
# 各数字の総和を求める | |
sum = 0 | |
for i in range(len(cardNumberlist)): | |
sum += int(cardNumberlist[i]) | |
# 総和を10で割った余りが0ならば、チェックディジットは正しい | |
if sum % 10 == 0: | |
return True | |
else: | |
return False | |
if __name__ == "__main__": | |
issue2 = Issue2() | |
# Mastercard | |
print(issue2.isValidCreditCardNumber("5555555555554444")) | |
print(issue2.isValidCreditCardNumber("5105105105105100")) | |
# Visa | |
print(issue2.isValidCreditCardNumber("4111111111111111")) | |
print(issue2.isValidCreditCardNumber("4012888888881881")) | |
# JCB | |
print(issue2.isValidCreditCardNumber("3530111333300000")) | |
print(issue2.isValidCreditCardNumber("3566002020360505")) | |
# American Express | |
print(issue2.isValidCreditCardNumber("378282246310005")) | |
print(issue2.isValidCreditCardNumber("371449635398431")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment