銷帳編號檢核!!

銷帳編號 銷編 銷帳編號檢核碼


銀行電子通路,最常在前端就希望可以做Account Check

以防止客戶利用滲透隨便自己亂打銷帳編號,

萬一主機也沒有擋掉,那就好笑了...

不過正常這當然還是以主機為主,前端Servlet為輔.....

util如下


public class PageUtil {
	/**
	 * 16 Digits Account Check!!! (Rule from iBancs)
	 * @param account	16 digits
	 * @param amount	less than 7 digits
	 * @param rule	21 digits
	 * @return result
	 */
	public static boolean chk16digitsAccount(String account, String amount, String rule) {
		
		boolean result = false;
		amount = StringUtils.formatWithZero(amount, 7);
		int[] intActAmt = new int[(account.length()-2) + amount.length()];
		
		for(int i=0; i < intActAmt.length; i++){
			if(i < account.length()-2)
				intActAmt[i] = account.charAt(i)-'0';
			else
				intActAmt[i] = amount.charAt(i-(account.length()-2))-'0';
		}
		
		int[] intRul = new int[rule.length()];
		for(int i=0; i < rule.length(); i++){
			intRul[i] = rule.charAt(i)-'0';
		}
		
		int sum = 0;
		String actChkCode = null;
		for(int i=0; i < intActAmt.length; i++){
			sum += intActAmt[i]*intRul[i];
			if(i==13)
				actChkCode = String.valueOf((10-(sum%10))%10);
		}
		String amtChkCode = String.valueOf((10-(sum%10))%10);
		
		if (actChkCode.equals(account.substring(14,15)) && amtChkCode.equals(account.substring(15,16)))
			result = true;
		
		return result;
	}
	
	/*
	public static void main(String[] args){
		System.out.println(chk16digitsAccount("9825100213001277","6200","234567891234567891234"));
	}
	*/
}

這邊主要是做16碼帳號檢核

其中要注意的就是


intActAmt[i] = account.charAt(i)-'0';

這邊使用charAt(i) 會直接抓出string 於i 的位置之ascii編碼,因此要減去 ' 0 ' (的 acsii編碼),

才會是我們所要的數字,不然在轉int array(int[])時,會塞入acsii編碼對應數字,而不是我們要的int type