身份证检验算法,以及15位和18位身份证的相互转换!
来源:互联网 发布:win7建立网络连接 编辑:程序博客网 时间:2024/05/29 11:07
package cn.ccb.boup.util.common;
import java.util.regex.*;
/**
* 身份证检验算法,以及15位和18位身份证的相互转换。
*
* @author guojg
*/
public class IdCardUtil {
public IdCardUtil() {
}
/**
* 15位身份证号码转化为18位的身份证。如果是18位的身份证则直接返回,不作任何变化。
*
* @param idCard,15位的有效身份证号码
* @return idCard18 返回18位的有效身份证
*/
public String IdCard15to18(String idCard) {
idCard = idCard.trim();
StringBuffer idCard18 = new StringBuffer(idCard);
// 加权因子
// int[] weight = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
// 校验码值
char[] checkBit = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3',
'2' };
int sum = 0;
// 15位的身份证
if (idCard != null && idCard.length() == 15) {
idCard18.insert(6, "19");
for (int index = 0; index < idCard18.length(); index++) {
char c = idCard18.charAt(index);
int ai = Integer.parseInt(new Character(c).toString());
// sum = sum+ai*weight[index];
// 加权因子的算法
int Wi = ((int) Math.pow(2, idCard18.length() - index)) % 11;
sum = sum + ai * Wi;
}
int indexOfCheckBit = sum % 11; // 取模
idCard18.append(checkBit[indexOfCheckBit]);
}
return idCard18.toString();
}
/**
* 转化18位身份证位15位身份证。如果输入的是15位的身份证则不做任何转化,直接返回。
*
* @param idCard
* 18位身份证号码
* @return idCard15
*/
public String IdCard18to15(String idCard) {
idCard = idCard.trim();
StringBuffer idCard15 = new StringBuffer(idCard);
if (idCard != null && idCard.length() == 18) {
idCard15.delete(17, 18);
idCard15.delete(6, 8);
}
return idCard15.toString();
}
/**
* 校验是否是一个有效的身份证。如果是18的身份证,则校验18位的身份证。15位的身份证不校验,也无法校验
*
* @param idCart
* @return
*/
public boolean checkIDCard(String idCard) {
boolean isIDCard = false;
Pattern pattern = Pattern.compile("\\d{15}|\\d{17}[x,X,0-9]");
Matcher matcher = pattern.matcher(idCard);
if (matcher.matches()) {// 可能是一个身份证
isIDCard = true;
if (idCard.length() == 18) {// 如果是18的身份证,则校验18位的身份证。15位的身份证暂不校验
String IdCard15 = IdCard18to15(idCard);
String IdCard18 = IdCard15to18(IdCard15);
if (!idCard.equals(IdCard18)) {
isIDCard = false;
}
} else if (idCard.length() == 15) {
isIDCard = true;
} else {
isIDCard = false;
}
}
return isIDCard;
}
public static void main(String[] args) {
IdCardUtil u = new IdCardUtil();
String idCard = "420106810304041";
System.out.println(u.IdCard15to18(idCard));
// u.IdCard15to18(idCard);
// u.IdCard18to15(idCard);
// boolean flag = u.checkIDCard(idCard);
}
}
- java 中国大陆的身份证检验算法,以及15位和18位身份证的相互转换。
- 身份证检验算法,以及15位和18位身份证的相互转换!
- 身份证15位与18位相互转换
- 15位身份证转换
- 15位身份证-18位转换
- 15位身份证补全为18位身份证算法
- 新旧身份证合法性验证及相互转换算法(三):Java身份证号码验证及将15位转换18位
- 身份证由15位到18位的转换
- 身份证15位升18位的算法
- .NET 15位身份证升级到18位的算法
- Delphi实现身份证15位升18位的算法
- 15位身份证升18位身份证的Oracle函数
- 15位和18位的身份证验证
- 身份证校验及其18岁判定(包含18位身份证和15位身份证)
- 18位身份证校验算法
- 18位身份证校验算法
- 18位身份证标准算法
- 18位身份证校验位算法
- 数据导出Excel
- DATALIST嵌套datalist,要求只查询一次数据库
- SWTableView 不支持Retina Display的bug修复
- SSL Ettercap Filter
- ListView组件的使用
- 身份证检验算法,以及15位和18位身份证的相互转换!
- solr调用 java php
- <高性能JavaScript>笔记 [7~10]
- hdu 1166 敌兵布阵(线段树——单点更新)
- spring 3.0 + ibatis 2 整合
- 安全警告——“Windows已经阻止此软件因为无法验证发行者”解决办法
- 配置ASP.NET平台时遇到的“访问IIS元数据库失败”--解决方案
- sql 函数实现三种父子递归
- 执行./startup.sh,或者./shutdown.sh的时候,Permission denied