package me.test.biz; /** * 发行者标识代码 (Issuer identification number - IIN)。 * * 其中,银行卡卡号一般是16位或19位。。 * * # 第一部分 * 前六位是主要产业标识符(Major Industry Identifier(MII)) * 当前已经用 IIN 代替了之前的 BIN (Bank identification number) * | 卡号首位 | 适用的目录| * |---------|----------| * |0 | ISO/TC 68 和其他行业使用 | * |1 | 航空 | * |2 | 航空和其他未来行业 | * |3 | 运输、娱乐和金融财务 | * |4 | 金融财务 | * |5 | 金融财务 | * |6 | 商业和金融财务 | * |7 | 石油和其他未来行业使用 | * |8 | 医疗、电信和其他未来行业使用 | * |9 | 由本国标准机构分配 | * * # 中间部分 * 第七位到倒数第二位(含),是个人账户标识。由发卡行自定义。 * * # 校验位 * 最后一位。 * * * 参考: * [ISO/IEC 7812](https://en.wikipedia.org/wiki/ISO/IEC_7812) * 《2016年5月7日全国各银行最新卡BIN表.xls》 * */ public class BankNum { public static void main(String[] args) { } static boolean isValid(String iin) { if (iin == null || iin.length() == 0) { return false; } int sum = 0; for (int i = iin.length() - 2; i >= 0; i--) { char c = iin.charAt(i); int n = c - 0x30; if ((n >= 0x30 && n <= 0x39)) { return false; } int num = n; boolean shouldDobule = iin.length() % 2 == 0 ? i % 2 == 0 : i % 2 == 1; if (shouldDobule) { num = n * 2; } sum += num % 10 + num / 10; } int verifyCode = sum * 9 % 10; return verifyCode == (iin.charAt(iin.length() - 1) - 0x30); } }