1. 程式人生 > >java、Android銀行卡校驗(程式碼copy過去直接用)

java、Android銀行卡校驗(程式碼copy過去直接用)

親愛的同仁們:

        最近專案中要本地校驗銀行卡賬號,後面總結出來,分享大家。

        原理:

        // Luhm校驗規則:16位銀行卡號(19位通用):
// 1.將未帶校驗位的 15(或18)位卡號從右依次編號 1 到 15(18),位於奇數位號上的數字乘以 2。
// 2.將奇位乘積的個十位全部相加,再加上所有偶數位上的數字。
// 3.將加法和加上校驗位能被 10 整除。

package com.susan.test;


import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Test {


// Description: 銀行卡號Luhm校驗


// Luhm校驗規則:16位銀行卡號(19位通用):


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


// 開頭6位
// private final static String strBin =
// "10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99";


private final static String SUCCESS = "true";


private final static String BAD_LENGTH = "銀行卡號長度必須在16到19之間";


private final static String NOT_NUMBER = "銀行卡必須全部為數字";


private final static String ILLEGAL_NUMBER = "銀行卡不符合規則";


public static String luhmCheck(String bankno) {
if (bankno.length() < 16 || bankno.length() > 19) {
return BAD_LENGTH;
}


Pattern pattern = Pattern.compile("[0-9]*");
Matcher match = pattern.matcher(bankno);
if (match.matches() == false) {
return NOT_NUMBER;
}


// if (strBin.indexOf(bankno.substring(0, 2)) == -1) {
// return "銀行卡號開頭6位不符合規範";
// }


int lastNum = Integer.parseInt(bankno.substring(bankno.length() - 1,
bankno.length()));// 取出最後一位(與luhm進行比較)


String first15Num = bankno.substring(0, bankno.length() - 1);// 前15或18位
// System.out.println(first15Num);
char[] newArr = new char[first15Num.length()]; // 倒敘裝入newArr
char[] tempArr = first15Num.toCharArray();
for (int i = 0; i < tempArr.length; i++) {
newArr[tempArr.length - 1 - i] = tempArr[i];
}
// System.out.println(newArr);


int[] arrSingleNum = new int[newArr.length]; // 奇數位*2的積 <9
int[] arrSingleNum2 = new int[newArr.length];// 奇數位*2的積 >9
int[] arrDoubleNum = new int[newArr.length]; // 偶數位陣列


for (int j = 0; j < newArr.length; j++) {
if ((j + 1) % 2 == 1) {// 奇數位
if ((int) (newArr[j] - 48) * 2 < 9)
arrSingleNum[j] = (int) (newArr[j] - 48) * 2;
else
arrSingleNum2[j] = (int) (newArr[j] - 48) * 2;
} else
// 偶數位
arrDoubleNum[j] = (int) (newArr[j] - 48);
}


int[] arrSingleNumChild = new int[newArr.length]; // 奇數位*2 >9
// 的分割之後的陣列個位數
int[] arrSingleNum2Child = new int[newArr.length];// 奇數位*2 >9
// 的分割之後的陣列十位數


for (int h = 0; h < arrSingleNum2.length; h++) {
arrSingleNumChild[h] = (arrSingleNum2[h]) % 10;
arrSingleNum2Child[h] = (arrSingleNum2[h]) / 10;
}


int sumSingleNum = 0; // 奇數位*2 < 9 的陣列之和
int sumDoubleNum = 0; // 偶數位陣列之和
int sumSingleNumChild = 0; // 奇數位*2 >9 的分割之後的陣列個位數之和
int sumSingleNum2Child = 0; // 奇數位*2 >9 的分割之後的陣列十位數之和
int sumTotal = 0;
for (int m = 0; m < arrSingleNum.length; m++) {
sumSingleNum = sumSingleNum + arrSingleNum[m];
}


for (int n = 0; n < arrDoubleNum.length; n++) {
sumDoubleNum = sumDoubleNum + arrDoubleNum[n];
}


for (int p = 0; p < arrSingleNumChild.length; p++) {
sumSingleNumChild = sumSingleNumChild + arrSingleNumChild[p];
sumSingleNum2Child = sumSingleNum2Child + arrSingleNum2Child[p];
}


sumTotal = sumSingleNum + sumDoubleNum + sumSingleNumChild
+ sumSingleNum2Child;


// 計算Luhm值
int k = sumTotal % 10 == 0 ? 10 : sumTotal % 10;
int luhm = 10 - k;


if (lastNum == luhm) {
return SUCCESS;// 驗證通過
} else {
return ILLEGAL_NUMBER;
}
}


public static void main(String[] args) {
String bankno = "6222620110020321114";
System.out.println(bankno + ":" + luhmCheck(bankno));
String bankno1 = "6212164000046323291";
System.out.println(bankno1 + ":" + luhmCheck(bankno1));
String bankno2 = "6222023104004123546";
System.out.println(bankno2 + ":" + luhmCheck(bankno2));
}


}