能夠用於前端須要用戶輸入銀行卡時作初步校驗html
銀行卡號碼的校驗採用Luhn算法,校驗過程大體以下:前端
從右到左給卡號字符串編號,最右邊第一位是1,最右邊第二位是2,最右邊第三位是3….git
從右向左遍歷,對每一位字符t執行第三個步驟,並將每一位的計算結果相加獲得一個數s。算法
對每一位的計算規則:若是這一位是奇數位,則返回t自己,若是是偶數位,則先將t乘以2獲得一個數n,若是n是一位數(小於10),直接返回n,不然將n的個位數和十位數相加返回。ide
由於最終的結果會對10取餘來判斷是否可以整除10,因此又叫作模10算法。code
% 取模 - 返回除法的餘數
*= 乘法賦值運算符 c = a 等效於 c = c a
// 取整除 - 返回商的整數部分(向下取整)orm
使用Python實現htm
def luhn(card_num): s = 0 card_num_length = len(card_num) for _ in range(1, card_num_length + 1): t = int(card_num[card_num_length - _]) print("當前銀行卡對應數字t={}".format(t)) print("當前_爲{}".format(_)) print("_取模{}".format(_ % 2)) if _ % 2 == 0: print("當前是偶數位") t *= 2 print("t={}".format(t)) s += t if t < 10 else t % 10 + t // 10 else: print("當前爲奇數位") s += t print("s={}".format(s)) return s % 10 == 0 if __name__ == '__main__': print(luhn('6226095711989751'))
執行結果:blog
當前銀行卡對應數字t=1 當前_爲1 _取模1 當前爲奇數位 s=1 當前銀行卡對應數字t=5 當前_爲2 _取模0 當前是偶數位 t=10 s=2 ...... 當前銀行卡對應數字t=6 當前_爲16 _取模0 當前是偶數位 t=12 s=70 True
參考來源:
http://www.javashuo.com/article/p-emodpatc-hz.html字符串
咱們以數字「7992739871」爲例,計算其校驗位:
從校驗位開始,從右往左,偶數位乘2(例如,7*2=14),而後將兩位數字的個位與十位相加(例如,10:1+0=1,14:1+4=5);
把獲得的數字加在一塊兒(本例中獲得67);
將數字的和取模10(本例中獲得7),再用10去減(本例中獲得3),獲得校驗位。
Python實現
def checkLuhn(purportedCC=''): sum_ = 0 parity = len(purportedCC) % 2 for i, digit in enumerate([int(x) for x in purportedCC]): if i % 2 == parity: digit *= 2 if digit > 9: digit -= 9 sum_ += digit return sum_ % 10 == 0