首先普及一下銀行卡號(hào)組成信息,
銀行卡號(hào)一般由三部分組成:
- 發(fā)卡行標(biāo)識(shí)代碼(BIN號(hào))
- 發(fā)卡行自定義位
- 校驗(yàn)碼闷叉。
銀行卡號(hào)的前6位是BIN號(hào),是bank identification number的縮寫,由國際標(biāo)準(zhǔn)化組織(ISO)分配給各從事跨行轉(zhuǎn)接交換的銀行卡組織。
一般地:4字頭——VISA杯瞻;5字頭——Mastercard;62——中國銀聯(lián)炫掐;3字頭——運(yùn)通魁莉、JCB等。
發(fā)卡行自定義位長(zhǎng)度可以是6-12位,一般可能會(huì)包含銀行內(nèi)部分行標(biāo)識(shí)旗唁,比如第6-7位宙地,01代表北京地區(qū)的卡,其余的就是隨即生成了逆皮。
最后卡號(hào)最末位的校驗(yàn)碼,具有一定的計(jì)算規(guī)則参袱,用于防偽电谣。銀聯(lián)標(biāo)準(zhǔn)卡符合中國銀聯(lián)標(biāo)準(zhǔn),使用中國銀聯(lián)分配的BIN碼(目前為622126-622925抹蚀,共800個(gè))剿牺,在中國銀聯(lián)支付網(wǎng)絡(luò)范圍和協(xié)議網(wǎng)絡(luò)下使用。
項(xiàng)目添加銀行卡信息時(shí)环壤,有這樣一個(gè)需求晒来,要求當(dāng)用戶輸入銀行卡后自動(dòng)檢測(cè)出該銀行卡屬于哪家銀行。
本文實(shí)現(xiàn)自定義EditText郑现,根據(jù)銀行卡號(hào)判斷該銀行卡所歸屬的銀行湃崩,格式化銀行卡號(hào),每四位增加一個(gè)空格接箫。數(shù)據(jù)來源網(wǎng)絡(luò)整理攒读,并不及時(shí),只供參考學(xué)習(xí)辛友。
先看效果圖:
使用方式
<com.aikaifa.bankcard.BandCardEditText
android:id="@+id/bankCardEditText"
android:layout_width="match_parent"
android:background="@drawable/bg_edittext"
android:padding="10dp"
android:layout_height="40dp"
android:hint="請(qǐng)輸入銀行卡號(hào)" />
tv_desc = (TextView) findViewById(R.id.tv_desc);
bankCardEditText = (BandCardEditText) findViewById(R.id.bankCardEditText);
bankCardEditText.setBankCardListener(new BandCardEditText.BankCardListener() {
@Override
public void success(String name) {
tv_desc.setText(name);
}
@Override
public void failure() {
tv_desc.setText("沒有查到所屬銀行");
}
});
實(shí)現(xiàn)過程:
1薄扁、新建類BandCardEditText繼承EditText
public class BandCardEditText extends EditText {
private boolean shouldStopChange = false;
private final String space = " ";
private BankCardListener listener;
public BandCardEditText(Context context) {
this(context, null);
}
public BandCardEditText(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BandCardEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
format(getText());
shouldStopChange = false;
setFocusable(true);
setEnabled(true);
setFocusableInTouchMode(true);
addTextChangedListener(new BandCardWatcher());
}
class BandCardWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
format(editable);
}
}
private void format(Editable editable) {
if (shouldStopChange) {
shouldStopChange = false;
return;
}
shouldStopChange = true;
String str = editable.toString().trim().replaceAll(space, "");
int len = str.length();
int courPos;
StringBuilder builder = new StringBuilder();
for (int i = 0; i < len; i++) {
builder.append(str.charAt(i));
if (i == 3 || i == 7 || i == 11 || i == 15) {
if (i != len - 1)
builder.append(space);
}
}
courPos = builder.length();
setText(builder.toString());
setSelection(courPos);
if (listener != null) {
if (isBankCard()) {
char[] ss = getBankCardText().toCharArray();
listener.success(BankInfo.getNameOfBank(ss, 0));
} else {
listener.failure();
}
}
}
public String getBankCardText() {
return getText().toString().trim().replaceAll(" ", "");
}
public boolean isBankCard() {
return checkBankCard(getBankCardText());
}
/**
* 校驗(yàn)銀行卡卡號(hào)
* @param cardId
* @return
*/
public boolean checkBankCard(String cardId) {
if(TextUtils.isEmpty(cardId)) {
return false;
}
char bit = getBankCardCheckCode(cardId.substring(0, cardId.length() - 1));
if (bit == 'N') {
return false;
}
return cardId.charAt(cardId.length() - 1) == bit;
}
/**
*
* @param nonCheckCodeCardId
* @return
*/
public char getBankCardCheckCode(String nonCheckCodeCardId) {
if (TextUtils.isEmpty(nonCheckCodeCardId)
|| !nonCheckCodeCardId.matches("\\d+")
|| nonCheckCodeCardId.length() < 16
|| nonCheckCodeCardId.length() > 19) {
//如果傳的不是數(shù)據(jù)返回N
return 'N';
}
char[] chs = nonCheckCodeCardId.trim().toCharArray();
int sum = 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;
}
sum += k;
}
return (sum % 10 == 0) ? '0' : (char) ((10 - sum % 10) + '0');
}
public void setBankCardListener(BankCardListener listener) {
this.listener = listener;
}
public interface BankCardListener {
void success(String name);
void failure();
}
}
源碼下載地址 https://pan.baidu.com/s/1qYfJoRy
【END】