Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save hihumikan/85bcc0412e8994dcdafdfea5dd06757f to your computer and use it in GitHub Desktop.
Save hihumikan/85bcc0412e8994dcdafdfea5dd06757f to your computer and use it in GitHub Desktop.
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