黑马程序员技术交流社区
标题:
身份证号校验
[打印本页]
作者:
javaAndroid
时间:
2014-11-22 13:37
标题:
身份证号校验
昨晚看到有位同学寻求15位18位身份证的正则
但仅仅是校验是否是身份证号
没有要求有效性
今天花了一点时间写了一个方法
用于校验身份证
大家没事玩玩,检测一下正确性
具体的计算方法可以网上搜一搜
顺便问一下正则
类似于[x|X]和[xX]的写法,有|和没有|的,两者有什么不同?
我感觉好像一样,哪位同学知道有什么不同还请告知。
/**
* @Description 身份证号有效性检测
* @param idStr 身份证号码的字符串
* @return 检测结果
*/
public static boolean isValidCardId(String idStr) {
// 先检测是否符合基本的号码规范,不符合直接false。
if (idStr.matches("[1-9]\\d{16}[\\dxX]")) {
// 加权因子,定义成int数组。
final int[] QUAN = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8,
4, 2 };
// 校验码,定义为String数组。
final String CHECK_STR = "10X98765432";
// 获取身份证号字符串的前17位。
String numFore_17 = idStr.substring(0, 17);
// 获取最后一位。即第18位。
String numLast = idStr.substring(17);
int sum = 0; // 存放17位数字本体码加权的和。
for (int i = 0; i < 17; i++) {
// 循环取出17位数字,并与对应位置的加权因子相乘,统计和。
sum += Integer.parseInt(String.valueOf(numFore_17.charAt(i))) * QUAN[i];
}
int mod = sum % 11; // 对和进行取余。
// mod值作为下标,取出对应的校验码。
String result = String.valueOf(CHECK_STR.charAt(mod));
// 将第18位字符与取出的校验码进行比较结果并返回。(忽略大小写)
return numLast.equalsIgnoreCase(result);
}
else {
return false;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2