java 生成銀行卡號
阿新 • • 發佈:2019-02-10
廢話不多說,直接上程式碼!
package com.test.util; public class BankNumberUtil{ private static int i = 0; /** * 需要傳入一個字首:6、8、9中的一個。 * 其中:6:型別1,8:型別2,9:型別3 【根據自己的業務定義】 * 其他則會返回異常 * @param prefix * @return */ public synchronized static String getBrankNumber(String prefix) if(StringUtil.isNotBlank(prefix)){ if("689".indexOf(prefix)>=0&&prefix.length()==1){ String st = "666"+prefix+getUnixTime(); return st+getBankCardCheckCode(st); }else{ System.out.println("銀行卡號字首有誤"); } }else{ System.out.println("銀行卡號去字首不能是空"); } } /*** * 獲取當前系統時間戳 並擷取 * @return */ private synchronized static String getUnixTime(){ try { Thread.sleep(10);//執行緒同步執行,休眠10毫秒 防止卡號重複 } catch (InterruptedException e) { e.printStackTrace(); } i++;i=i>100?i%10:i; return ((System.currentTimeMillis()/100)+"").substring(1)+(i%10); } /** * 校驗銀行卡卡號 * @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'); } public static void main(String[] args) { try { System.out.println(getBrankNumber("8")); } catch (AppException e) { e.printStackTrace(); } } }