效驗是否為銀行卡

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   strong   for   

http://www.oschina.net/code/snippet_86738_3128

效驗是否為銀行卡,用於驗證 
現行 16 位銀聯卡現行卡號開頭 6 位是 622126~622925 之間的,7 到 15 位是銀行自訂的, 
可能是發卡分行,發卡網點,發卡序號,第 16 位是校正碼。 

16 位卡號校正位採用 Luhm 校正方法計算: 

1,將未帶校正位的 15 位卡號從右依次編號 1 到 15,位於奇數位號上的數字乘以 2 
2,將奇位乘積的個十位全部相加,再加上所有偶數位上的數字 
3,將加法和加上校正位能被 10 整除。 

   6  2  2  5   8  8  1  4   1  4  2  0   7  4  3*  2     2      2     2      2     2      2     2--------------------------------------------------  12  2  4  5  16  8  2  4   2  4  4     14  4  6將上面的數字加和:1+2+2+4+5+1+6+8+2+4+2+4+4+1+4+4+6 = 60由於 60 加上 0 才能被 10 整除,所以校正位為 0因此該卡號為 6225 8814 1420 7430

 


如果其中一位元字換掉的話,直接導致最後校正位錯誤。 標籤:銀行卡
public class Test {     public static void main(String[] args) {        String card = "6227007200120897790";        System.out.println("      card: " + card);        System.out.println("check code: " + getBankCardCheckCode(card));        System.out.println("是否為銀行卡:"+checkBankCard(card));    }        /**     * 校正銀行卡卡號     * @param cardId     * @return     */    public static boolean checkBankCard(String cardId) {             char bit = getBankCardCheckCode(cardId.substring(0, cardId.length() - 1));             if(bit == ‘N‘){                 return false;             }             return cardId.charAt(cardId.length() - 1) == bit;    }        /**     * 從不含校正位的銀行卡卡號採用 Luhm 校正演算法獲得校正位     * @param nonCheckCodeCardId     * @return     */    public static char getBankCardCheckCode(String nonCheckCodeCardId){        if(nonCheckCodeCardId == null || nonCheckCodeCardId.trim().length() == 0                || !nonCheckCodeCardId.matches("\\d+")) {            //如果傳的不是資料返回N            return ‘N‘;        }        char[] chs = nonCheckCodeCardId.trim().toCharArray();        int luhmSum = 0;        for(int i = chs.length - 1, j = 0; i >= 0; i--, j++) {            int k = chs[i] - ‘0‘;            if(j % 2 == 0) {                k *= 2;                k = k / 10 + k % 10;            }            luhmSum += k;                   }        return (luhmSum % 10 == 0) ? ‘0‘ : (char)((10 - luhmSum % 10) + ‘0‘);    }}

 

OC:
/** * 校正銀行卡卡號 * @param cardId * @return */BOOL checkCardNo(NSString* cardNo){    if ((int)cardNo.length < 13 || (int)cardNo.length > 19) return NO;    NSString *str = [cardNo substringWithRange:NSMakeRange(0, cardNo.length - 1)];    int luhmSum = 0;    for(int i = (int)str.length - 1, j = 0; i >= 0; i--, j++) {        int k = [str characterAtIndex:i] - ‘0‘;        if(j % 2 == 0) {            k *= 2;            k = k / 10 + k % 10;        }        luhmSum += k;    }    char bit = (luhmSum % 10 == 0) ? ‘0‘ : (char)((10 - luhmSum % 10) + ‘0‘);    if(bit == ‘N‘){        return false;    }    return [cardNo characterAtIndex:cardNo.length - 1] == bit;}

 

 

效驗是否為銀行卡

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.