package test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 身份证号码验证
*
*/
public class IdentificationCodeUtil {
public static final int IDENTITYCODE_OLD = 15; // 老身份证15位
public static final int IDENTITYCODE_NEW = 18; // 新身份证18位
public static int[] Wi = new int[17];
/**
* 判断身份证号码是否正确。
*
* @param code
* 身份证号码。
* @return 如果身份证号码正确,则返回true,否则返回false。
*/
public static boolean isIdentityCode(String code) {
if (StringUtil.empty(code)) {
return false;
}
String birthDay = "";
code = code.trim();
// 长度只有15和18两种情况
if ((code.length() != IDENTITYCODE_OLD)
&& (code.length() != IDENTITYCODE_NEW)) {
return false;
}
// 身份证号码必须为数字(18位的新身份证最后一位可以是x)
Pattern pt = Pattern.compile("\\d{15,17}([\\dxX]{1})?");
Matcher mt = pt.matcher(code);
if (!mt.find()) {
return false;
}
// 验证生日
if (code.length() == IDENTITYCODE_OLD) {
birthDay = "19" + code.substring(6, 12);
} else {
birthDay = code.substring(6, 14);
}
if (!TimeUtil.isRightDate(birthDay, "yyyyMMdd")) {
return false;
}
// 最后一位校验码验证
if (code.length() == IDENTITYCODE_NEW) {
String lastNum = getCheckFlag(code.substring(0,
IDENTITYCODE_NEW - 1));
// check last digit
if (!("" + code.charAt(IDENTITYCODE_NEW - 1)).toUpperCase().equals(
lastNum)) {
return false;
}
}
return true;
}
/**
* 获取新身份证的最后一位:检验位
*
* @param code
* 18位身份证的前17位
* @return 新身份证的最后一位
*/
private static String getCheckFlag(String code) {
int[] varArray = new int[code.length()];
String lastNum = "";
int numSum = 0;
// 初始化位权值
setWiBuffer();
for (int i = 0; i < code.length(); i++) {
varArray[i] = NumberUtil.toInt("" + code.charAt(i));
varArray[i] = varArray[i] * Wi[i];
numSum = numSum + varArray[i];
}
int checkDigit = 12 - numSum % 11;
switch (checkDigit) {
case 10:
lastNum = "X";
break;
case 11:
lastNum = "0";
break;
case 12:
lastNum = "1";
break;
default:
lastNum = String.valueOf(checkDigit);
}
return lastNum;
}
/**
* 初始化位权值
*/
private static void setWiBuffer() {
for (int i = 0; i < Wi.length; i++) {
int k = (int) Math.pow(2, (Wi.length - i));
Wi[i] = k % 11;
}
}
/**
* 判别是否字符串为null或者没有内容,或者全部为空格。
*/
public static boolean empty(String o) {
return ((null == o) || (o.length() <= 0) || (o.trim().equals("")));
}
/**
* 将15位身份证号码升级为18位身份证号码
*
* @param code
* 15位身份证号码
* @return 18位身份证号码
*/
public static String update2eighteen(String code) {
if (StringUtil.empty(code)) {
return "";
}
code = code.trim();
if (code.length() != IDENTITYCODE_OLD || !isIdentityCode(code)) {
return "";
}
code = code.substring(0, 6) + "19" + code.substring(6);
//
code = code + getCheckFlag(code);
return code;
}
public static void main(String[] args){
String[] codeArray = new String[]{"330521197411044030","53010119810602007x","53010119810602001x"};
for(int i= 0;i<codeArray.length;i++){
if(isIdentityCode(codeArray[i])){
System.out.println(codeArray[i]+":为正确的身份证号码!");
}else{
System.out.println(codeArray[i]+":为错误的身份证号码!");
}
}
System.out.println("转换后的身份证号码为:"+update2eighteen("330521820721052"));;
}
}
分享到:
相关推荐
最完善的身份证号码合法性校验Java算法,适合Android平台,可以直接拿来在项目中使用,正则表达式。
java实现的18位身份证格式验证算法
JAVA身份证号码验证工具,通过身份证号码生成规则,能验证15位、18位身份证号码,必备验证方式
身份证号码验证算法 (一) 18身份证号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。 排列顺序从左至右依次为:六位数字地址码 + 八位数字出生日期码 + 三位数字顺序码 + 一位校验码。...
C#实现的18位身份证格式验证算法.txt
18位身份证号码验证算法.doc
公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
通过js验证身份证是否有效的js以及身份证的验证算法详解;包括详细的js代码
根据中国公民身份证号码算法 实现验证身份证号码合法性 已实现java类函数 可直接调用即可 非常方便实用
1. 将身份证号码前17位数分别乘以不同的系数,从第1位到第17位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2. 将得到的17个乘积相加。 3. 将相加后的和除以11并得到余数。 4. 余数可能为0 1 2 3 4 5 6 7 8 9...
该函数是支持Oracle环境下的对身份照进行校验的函数,它是按照身份照计算算法去校验的,能够精准的判断出身份照是否合法,通过返回值为1:表示为正确的身份证,返回值为0表示为错误的身份证
代码 无向图关联矩阵和邻接矩阵的相互转换算法代码代码 无向图关联矩阵和邻接矩阵的相互转换算法代码代码 无向图关联矩阵和邻接矩阵的相互转换算法代码代码 无向图关联矩阵和邻接矩阵的相互转换算法代码代码 无向图...
代码 有向图关联矩阵和邻接矩阵的相互转换算法代码代码 有向图关联矩阵和邻接矩阵的相互转换算法代码代码 有向图关联矩阵和邻接矩阵的相互转换算法代码代码 有向图关联矩阵和邻接矩阵的相互转换算法代码代码 有向图...
身份证号码验证示例源码 <br>中国身份证号码验证,支持15,18位,可验证成功90%的身份证号 利用正则进行身份证算法验证 <br>非常不错
C#实现的18位身份证格式验证算法.doc
主要介绍了身份证号码验证算法深入研究和Java实现,本文讲解了18身份证号码的结构、根据17位数字本体码获取最后一位校验码程序实例等内容,需要的朋友可以参考下
利用Java进行身份证正反面信息识别,使用了百度提供的库
中国的居民身份证有18位。其中前17位是信息码,最后1位是校验码。每位信息码可以是0-9的数字,而校验码可以是0-9或X,其中X表示10。 身份证校验码算法: 设18位身份证号序列从左到右为: 引用 a[0], a[1], a[2], a[3...
这是一个网页源码,身份证的验证。利用JavaScript制作的。
传统拜占庭一致性中常见的中心化和去中心化算法在解决合法性验证的过程中存在容错率低、消息复杂度高等问题,为此,提出新的区块链一致性算法,引入两阶段提交和法定人数投票的过程,利用区块链协议的分布式总账特点...