銀行卡號碼的校驗規則(Luhn算法/模10算法)

銀行卡校驗

能夠用於前端須要用戶輸入銀行卡時作初步校驗html

銀行卡號碼的校驗採用Luhn算法,校驗過程大體以下:前端

  1. 從右到左給卡號字符串編號,最右邊第一位是1,最右邊第二位是2,最右邊第三位是3….git

  2. 從右向左遍歷,對每一位字符t執行第三個步驟,並將每一位的計算結果相加獲得一個數s。算法

  3. 對每一位的計算規則:若是這一位是奇數位,則返回t自己,若是是偶數位,則先將t乘以2獲得一個數n,若是n是一位數(小於10),直接返回n,不然將n的個位數和十位數相加返回。ide

  4. 若是s可以整除10,則此號碼有效,不然號碼無效。

由於最終的結果會對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字符串

百度百科介紹Luhn算法

咱們以數字「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
相關文章
相關標籤/搜索