新旧身份证合法性验证及相互转换算法(三):Java身份证号码验证及将15位转换18位
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位相关推荐
- 常用正则表达式 新旧身份证合法性验证及相互转换算法
关键字:正则表达式 模式匹配 Javascript 摘要:收集一些常用的正则表达式. 正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番.我将一些常用的表 ...
- 简单的关于身份证(15位或者18位)合法性验证
简单的关于身份证(15位或者18位)合法性验证 package com.clark.test.idcard;/*** 测试校验身份证合法性的小程序* <p>我们常用的身份证号码为18位或者 ...
- 身份证校验(//身份证号合法性验证 //支持15位和18位身份证号//支持地址编码、出生日期、校验位验证)
window.checkIdNumber=(function () {var vcity = {11: "北京", 12: "天津", 13: "河北 ...
- javascript 15位和18位身份证的正则表达式及其验证
1.简单的正则表达式: (1)preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card) (2)preg_match(& ...
- SQLServer2005 身份证函数,含验证和15位转18位
Author:水如烟 SQLServer2005 身份证函数,含验证和15位转18位 USE [ LzmTWWorks ] GO /* ***** 对象: UserDefinedFunction ...
- JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别
我们的身份证号码包含很多的信息,下面的代码提供了身份证的解析功能,具体看注释吧,已经写全了 import java.text.SimpleDateFormat; import java.util.Da ...
- 【转载】 身份证号码校验(15位和18位都可以)
转载自: 开源中国社区 面向对象的15位.18位中国大陆身份证号码解析.验证工具 import java.text.ParseException; import java.text.Simple ...
- 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位
使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...
- js 身份证精确校验(支持15位和18位身份证号 )
js 校验方法 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function IdentityCode(code){var city={11:&qu ...
最新文章
- request.getparameter特殊字符变成?号问号_15 个不可不知的 Linux 特殊字符,你懂几个?...
- Latex使用技巧01:改变数学公式字体的颜色
- 作为Web开发人员,我为什么喜欢Google Chrome浏览器
- 周末加班重构代码的几点感慨
- java 实现超时_如何实现带有超时的Runnable? - java
- 管理系统制作的python代码_python学生管理系统代码实现
- Shiro过滤器配置(ShiroFilterFactoryBean)
- Android5.0L因SystemUI ANR导致的黑屏问题分析
- w我的页面显示服务器错误,vue项目,在本地打开一个页面正常,部署到服务器就会出现 404Not Found 求解?...
- 《烈烈先秦》6、六国的噩梦——大秦武安君白起
- 杭州市直职称计算机考点地址,杭州中级会计考试地点在哪里
- 【mysql】浮点类型
- MySql数据库版本查询
- 时间序列:Shapelets
- 动态规划算法学习(一)爬楼梯和凑金额
- GitHub使用方法(初级)
- vue3循环遍历图片渲染无效果
- 通过ADO连接各种数据库的字符串
- MATLAB路面裂缝检测识别算法仿真
- 中兴c300业务板_中兴C300 GTGO ETGO GTGOE GTGOG OLT业务板 EPON GPON