android银行卡号验证算法详解
现行 16 位银联卡现行卡号开头 6 位是 622126~622925 之间的,7 到 15 位是银行自定义的, 可能是发卡分行,发卡网点,发卡序号,第 16 位是校验码。
16 位卡号校验位采用 Luhm 校验方法计算:
1、将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2
2、将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
3、将加法和加上校验位能被 10 整除。
public class CheckIdCard {
/**
* 校验银行卡卡号
*
* @param cardId
* @return
*/
public static boolean checkBankCard(String cardId) {
char bit = getBankCardCheckCode(cardId
.substring(0, cardId.length() - 1));
if (bit == 'N') {
return false;
}
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+")) {
// 如果传的不是数据返回N
return 'N';
}
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');
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Android 点击ImageButton时有“按下”的效果的实现
这篇文章主要介绍了 Android 点击ImageButton时有“按下”的效果的实现的相关资料,需要的朋友可以参考下2017-03-03
Android编程使用GestureDetector实现简单手势监听与处理的方法
这篇文章主要介绍了Android编程使用GestureDetector实现简单手势监听与处理的方法,简单讲述了Android手势监听的原理并结合实例形式分析了GestureDetector实现手势监听与处理的相关操作技巧,需要的朋友可以参考下2017-09-09
Android Studio preview 不固定及常见问题的解决办法
preview 可以帮助您预览您的布局文件将如何在用户的设备上呈现。这篇文章主要介绍了Android Studio preview 不固定及常见问题的解决办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-05-05
Android获取设备CPU核数、时钟频率以及内存大小的方法
这篇文章主要介绍了Android获取设备CPU核数、时钟频率以及内存大小的方法,涉及Android针对系统硬件相关操作技巧,需要的朋友可以参考下2016-07-07
Android编程之绘制文本(FontMetrics)实现方法
这篇文章主要介绍了Android编程之绘制文本(FontMetrics)实现方法,结合实例形式较为详细的分析了Android使用FontMetrics对象绘制文本的相关技巧,需要的朋友可以参考下2015-12-12


最新评论