js银行卡函数校验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | function isBankCard( cardNum ) { var sumOdd = 0; var sumEven = 0; var wei = cardNum.split( '' ).reverse(); var length = wei.length; var i; // 转换为数值 for (i=0; i<length; i++) { wei[i] = Number( wei[i] ); } for (i=0; (2*i+1) < length; i++) { sumOdd += wei[ 2*i ]; } for (i=0; (2 * i + 1) < length; i++) { if ( (wei[2 * i + 1] * 2) > 9 ) { wei[2 * i + 1] = wei[2 * i + 1] * 2 - 9; } else { wei[2 * i + 1] *= 2; } sumEven += wei[2 * i + 1]; } if ((sumOdd + sumEven) % 10 == 0) { return true ; } else { return false ; } } alert( isBankCard( '6214836558876492' ) ); |
附规则:
现行 16 位银联卡现行卡号开头 6 位是 622126~622925 之间的,7 到 15 位是银行自定义的,
可能是发卡分行,发卡网点,发卡序号,第 16 位是校验码。
16 位卡号校验位采用 Luhm 校验方法计算:
1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2
2,将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
3,将加法和加上校验位能被 10 整除。
比如卡号:
6 2 2 5 8 8 1 4 1 4 2 0 7 4 3 * 2 2 2 2 2 2 2 2 -------------------------------------------------- 12 2 4 5 16 8 2 4 2 4 4 14 4 6
将上面的数字加和:1+2+2+4+5+1+6+8+2+4+2+4+4+1+4+4+6 = 60
由于 60 加上 0 才能被 10 整除,所以校验位为 0
因此该卡号为 6225 8814 1420 7430
如果其中一位数字换掉的话,直接导致最后校验位错误。
写了个程序进行计算:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | public class Test5 { public static void main(String[] args) { String card = "622588141420743" ; System. out .println( " card: " + card); System. out .println( "check code: " + getBankCardCheckCode(card)); System. out .println( " card id: " + card + getBankCardCheckCode(card)); } /** * 校验银行卡卡号 * @param cardId * @return */ public static boolean checkBankCard(String cardId) { char bit = getBankCardCheckCode(cardId.substring(0, cardId.length() - 1)); 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+" )) { throw new IllegalArgumentException( "Bank card code must be number!" ); } 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' ); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!