標籤: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;}
效驗是否為銀行卡