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身份证号码验证及将15位转换18位相关推荐

  1. 常用正则表达式 新旧身份证合法性验证及相互转换算法

    关键字:正则表达式  模式匹配 Javascript 摘要:收集一些常用的正则表达式. 正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番.我将一些常用的表 ...

  2. 简单的关于身份证(15位或者18位)合法性验证

    简单的关于身份证(15位或者18位)合法性验证 package com.clark.test.idcard;/*** 测试校验身份证合法性的小程序* <p>我们常用的身份证号码为18位或者 ...

  3. 身份证校验(//身份证号合法性验证 //支持15位和18位身份证号//支持地址编码、出生日期、校验位验证)

    window.checkIdNumber=(function () {var vcity = {11: "北京", 12: "天津", 13: "河北 ...

  4. javascript 15位和18位身份证的正则表达式及其验证

    1.简单的正则表达式: (1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card) (2)preg_match(& ...

  5. SQLServer2005 身份证函数,含验证和15位转18位

    Author:水如烟 SQLServer2005 身份证函数,含验证和15位转18位 USE   [ LzmTWWorks ] GO /* ***** 对象:  UserDefinedFunction ...

  6. JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别

    我们的身份证号码包含很多的信息,下面的代码提供了身份证的解析功能,具体看注释吧,已经写全了 import java.text.SimpleDateFormat; import java.util.Da ...

  7. 【转载】 身份证号码校验(15位和18位都可以)

    转载自: 开源中国社区    面向对象的15位.18位中国大陆身份证号码解析.验证工具 import java.text.ParseException; import java.text.Simple ...

  8. 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

    使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...

  9. js 身份证精确校验(支持15位和18位身份证号 )

    js 校验方法 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCode(code){var city={11:&qu ...

最新文章

  1. request.getparameter特殊字符变成?号问号_15 个不可不知的 Linux 特殊字符,你懂几个?...
  2. Latex使用技巧01:改变数学公式字体的颜色
  3. 作为Web开发人员,我为什么喜欢Google Chrome浏览器
  4. 周末加班重构代码的几点感慨
  5. java 实现超时_如何实现带有超时的Runnable? - java
  6. 管理系统制作的python代码_python学生管理系统代码实现
  7. Shiro过滤器配置(ShiroFilterFactoryBean)
  8. Android5.0L因SystemUI ANR导致的黑屏问题分析
  9. w我的页面显示服务器错误,vue项目,在本地打开一个页面正常,部署到服务器就会出现 404Not Found 求解?...
  10. 《烈烈先秦》6、六国的噩梦——大秦武安君白起
  11. 杭州市直职称计算机考点地址,杭州中级会计考试地点在哪里
  12. 【mysql】浮点类型
  13. MySql数据库版本查询
  14. 时间序列:Shapelets
  15. 动态规划算法学习(一)爬楼梯和凑金额
  16. GitHub使用方法(初级)
  17. vue3循环遍历图片渲染无效果
  18. 通过ADO连接各种数据库的字符串
  19. MATLAB路面裂缝检测识别算法仿真
  20. 中兴c300业务板_中兴C300 GTGO ETGO GTGOE GTGOG OLT业务板 EPON GPON

热门文章

  1. python提取word表格中数据
  2. 希捷酷鱼12 500G的确有问题,好惨啊
  3. python迷宫小游戏代码_TensorFlow应用实战-17-Qlearning实现迷宫小游戏
  4. 计算机毕业设计SSM大学生心理健康管理系统【附源码数据库】
  5. Linux Driver教程PPT
  6. ghost后分区丢失如何恢复数据-分区表医生!
  7. 计算机网络实验3--IP静态路由搭建
  8. c#中的interface abstract与virtual的介绍与使用
  9. php邮件服务器搭建,php发送邮件,不需要搭建邮件服务器方法
  10. WordPress:自定义头像