身份证号码18位与15位转换.docx
- 文档编号:5418459
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:21
- 大小:19.42KB
身份证号码18位与15位转换.docx
《身份证号码18位与15位转换.docx》由会员分享,可在线阅读,更多相关《身份证号码18位与15位转换.docx(21页珍藏版)》请在冰豆网上搜索。
身份证号码18位与15位转换
身份证18位与15位转换
package;
import;
import;
import;
import;
import;
import;
import;
import;
/**
*身份证工具类
*@authorKobe
*@version2011-08-08
*/
publicclassIdcardUtilsextendsStringUtils{
/**中国公民身份证号码最小长度。
*/
publicstaticfinalintCHINA_ID_MIN_LENGTH=15;
/**中国公民身份证号码最大长度。
*/
publicstaticfinalintCHINA_ID_MAX_LENGTH=18;
/**省、直辖市代码表*/
publicstaticfinalStringcityCode[]={
"11","12","13","14","15","21","22","23","31","32","33","34","35","36","37","41",
"42","43","44","45","46","50","51","52","53","54","61","62","63","64","65","71",
"81","82","91"
};
/**每位加权因子*/
publicstaticfinalintpower[]={
7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
};
/**第18位校检码*/
publicstaticfinalStringverifyCode[]={
"1","0","X","9","8","7","6","5","4","3","2"
};
/**最低年限*/
publicstaticfinalintMIN=1930;
publicstaticMap
/**台湾身份首字母对应数字*/
publicstaticMap
/**香港身份首字母对应数字*/
publicstaticMap
static{
cityCodes.put("11","北京");
cityCodes.put("12","天津");
cityCodes.put("13","河北");
cityCodes.put("14","山西");
cityCodes.put("15","内蒙古");
cityCodes.put("21","辽宁");
cityCodes.put("22","吉林");
cityCodes.put("23","黑龙江");
cityCodes.put("31","上海");
cityCodes.put("32","江苏");
cityCodes.put("33","浙江");
cityCodes.put("34","安徽");
cityCodes.put("35","福建");
cityCodes.put("36","江西");
cityCodes.put("37","山东");
cityCodes.put("41","河南");
cityCodes.put("42","湖北");
cityCodes.put("43","湖南");
cityCodes.put("44","广东");
cityCodes.put("45","广西");
cityCodes.put("46","海南");
cityCodes.put("50","重庆");
cityCodes.put("51","四川");
cityCodes.put("52","贵州");
cityCodes.put("53","云南");
cityCodes.put("54","西藏");
cityCodes.put("61","陕西");
cityCodes.put("62","甘肃");
cityCodes.put("63","青海");
cityCodes.put("64","宁夏");
cityCodes.put("65","新疆");
cityCodes.put("71","台湾");
cityCodes.put("81","香港");
cityCodes.put("82","澳门");
cityCodes.put("91","国外");
twFirstCode.put("A",10);
twFirstCode.put("B",11);
twFirstCode.put("C",12);
twFirstCode.put("D",13);
twFirstCode.put("E",14);
twFirstCode.put("F",15);
twFirstCode.put("G",16);
twFirstCode.put("H",17);
twFirstCode.put("J",18);
twFirstCode.put("K",19);
twFirstCode.put("L",20);
twFirstCode.put("M",21);
twFirstCode.put("N",22);
twFirstCode.put("P",23);
twFirstCode.put("Q",24);
twFirstCode.put("R",25);
twFirstCode.put("S",26);
twFirstCode.put("T",27);
twFirstCode.put("U",28);
twFirstCode.put("V",29);
twFirstCode.put("X",30);
twFirstCode.put("Y",31);
twFirstCode.put("W",32);
twFirstCode.put("Z",33);
twFirstCode.put("I",34);
twFirstCode.put("O",35);
hkFirstCode.put("A",1);
hkFirstCode.put("B",2);
hkFirstCode.put("C",3);
hkFirstCode.put("R",18);
hkFirstCode.put("U",21);
hkFirstCode.put("Z",26);
hkFirstCode.put("X",24);
hkFirstCode.put("W",23);
hkFirstCode.put("O",15);
hkFirstCode.put("N",14);
}
/**
*将15位身份证号码转换为18位
*@paramidCard
*15位身份编码
*@return18位身份编码
*/
publicstaticStringconver15CardTo18(StringidCard){
StringidCard18="";
if(idCard.length()!
=CHINA_ID_MIN_LENGTH){
returnnull;
}
if(isNum(idCard)){
//获取出生年月日
Stringbirthday=idCard.substring(6,12);
DatebirthDate=null;
try{
birthDate=newSimpleDateFormat("yyMMdd").parse(birthday);
}catch(ParseExceptione){
e.printStackTrace();
}
Calendarcal=Calendar.getInstance();
if(birthDate!
=null)
cal.setTime(birthDate);
//获取出生年(完全表现形式,如:
2010)
StringsYear=String.valueOf(cal.get(Calendar.YEAR));
idCard18=idCard.substring(0,6)+sYear+idCard.substring(8);
//转换字符数组
char[]cArr=idCard18.toCharArray();
if(cArr!
=null){
int[]iCard=converCharToInt(cArr);
intiSum17=getPowerSum(iCard);
//获取校验位
StringsVal=getCheckCode18(iSum17);
if(sVal.length()>0){
idCard18+=sVal;
}else{
returnnull;
}
}
}else{
returnnull;
}
returnidCard18;
}
/**
*将18位身份证号码转换为15位
*@paramidCard
*18位身份编码
*@return15位身份编码
*/
publicstaticStringconver18CardTo15(StringidCard){
StringidCard15="";
if(idCard.length()!
=CHINA_ID_MAX_LENGTH){
returnnull;
}
StringBuffersb=newStringBuffer(idCard);
sb.deleteCharAt(17);
sb.deleteCharAt(7);
sb.deleteCharAt(6);
idCard15=sb.toString();
returnidCard15;
}
/**
*验证身份证是否合法
*/
publicstaticbooleanvalidateCard(StringidCard){
Stringcard=idCard.trim();
if(validateIdCard18(card)){
returntrue;
}
if(validateIdCard15(card)){
returntrue;
}
String[]cardval=validateIdCard10(card);
if(cardval!
=null){
if(cardval[2].equals("true")){
returntrue;
}
}
returnfalse;
}
/**
*验证18位身份编码是否合法
*
*@paramidCard身份编码
*@return是否合法
*/
publicstaticbooleanvalidateIdCard18(StringidCard){
booleanbTrue=false;
if(idCard.length()==CHINA_ID_MAX_LENGTH){
//前17位
Stringcode17=idCard.substring(0,17);
//第18位
Stringcode18=idCard.substring(17,CHINA_ID_MAX_LENGTH);
if(isNum(code17)){
char[]cArr=code17.toCharArray();
if(cArr!
=null){
int[]iCard=converCharToInt(cArr);
intiSum17=getPowerSum(iCard);
//获取校验位
Stringval=getCheckCode18(iSum17);
if(val.length()>0){
if(val.equalsIgnoreCase(code18)){
bTrue=true;
}
}
}
}
}
returnbTrue;
}
/**
*验证15位身份编码是否合法
*
*@paramidCard
*身份编码
*@return是否合法
*/
publicstaticbooleanvalidateIdCard15(StringidCard){
if(idCard.length()!
=CHINA_ID_MIN_LENGTH){
returnfalse;
}
if(isNum(idCard)){
StringproCode=idCard.substring(0,2);
if(cityCodes.get(proCode)==null){
returnfalse;
}
StringbirthCode=idCard.substring(6,12);
DatebirthDate=null;
try{
birthDate=newSimpleDateFormat("yy").parse(birthCode.substring(0,2));
}catch(ParseExceptione){
e.printStackTrace();
}
Calendarcal=Calendar.getInstance();
if(birthDate!
=null)
cal.setTime(birthDate);
if(!
valiDate(cal.get(Calendar.YEAR),Integer.valueOf(birthCode.substring(2,4)),
Integer.valueOf(birthCode.substring(4,6)))){
returnfalse;
}
}else{
returnfalse;
}
returntrue;
}
/**
*验证10位身份编码是否合法
*
*@paramidCard身份编码
*@return身份证信息数组
*
*[0]-台湾、澳门、香港[1]-性别(男M,女F,未知N)[2]-是否合法(合法true,不合法false)
*若不是身份证件号码则返回null
*
*/
publicstaticString[]validateIdCard10(StringidCard){
String[]info=newString[3];
Stringcard=idCard.replaceAll("[\\(|\\)]","");
if(card.length()!
=8&&card.length()!
=9&&idCard.length()!
=10){
returnnull;
}
if(idCard.matches("^[a-zA-Z][0-9]{9}$")){//台湾
info[0]="台湾";
"11111");
Stringchar2=idCard.substring(1,2);
if(char2.equals("1")){
info[1]="M";
"MMMMMMM");
}elseif(char2.equals("2")){
info[1]="F";
"FFFFFFF");
}else{
info[1]="N";
info[2]="false";
"NNNN");
returninfo;
}
info[2]=validateTWCard(idCard)?
"true":
"false";
}elseif(idCard.matches("^[1|5|7][0-9]{6}\\(?
[0-9A-Z]\\)?
$")){//澳门
info[0]="澳门";
info[1]="N";
//TODO
}elseif(idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?
[0-9A]\\)?
$")){//香港
info[0]="香港";
info[1]="N";
info[2]=validateHKCard(idCard)?
"true":
"false";
}else{
returnnull;
}
returninfo;
}
/**
*验证台湾身份证号码
*
*@paramidCard
*身份证号码
*@return验证码是否符合
*/
publicstaticbooleanvalidateTWCard(StringidCard){
Stringstart=idCard.substring(0,1);
Stringmid=idCard.substring(1,9);
Stringend=idCard.substring(9,10);
IntegeriStart=twFirstCode.get(start);
Integersum=iStart/10+(iStart%10)*9;
char[]chars=mid.toCharArray();
Integeriflag=8;
for(charc:
chars){
sum=sum+Integer.valueOf(c+"")*iflag;
iflag--;
}
return(sum%10==0?
0:
(10-sum%10))==Integer.valueOf(end)?
true:
false;
}
/**
*验证香港身份证号码(存在Bug,部份特殊身份证无法检查)
*
*身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58前2位英文字符A-Z分别对应数字10-35
*最后一位校验码为0-9的数字加上字符"A","A"代表10
*
*
*将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效
*
*
*@paramidCard身份证号码
*@return验证码是否符合
*/
publicstaticbooleanvalidateHKCard(StringidCard){
Stringcard=idCard.replaceAll("[\\(|\\)]","");
Integersum=0;
if(card.length()==9){
sum=(Integer.valueOf(card.substring(0,1).toUpperCase().toCharArray()[0])-55)*9
+(Integer.valueOf(card.substring(1,2).toUpperCase().toCharArray()[0])-55)*8;
card=card.substring(1,9);
}else{
sum=522+(Integer.valueOf(card.substring(0,1).toUpperCase().toCharArray()[0])-55)*8;
}
Stringmid=card.substring(1,7);
Stringend=card.substring(7,8);
char[]chars=mid.toCharArray();
Integeriflag=7;
for(charc:
chars){
sum=sum+Integer.valueOf(c+"")*iflag;
iflag--;
}
if(end.toUpperCase().equals("A")){
sum=sum+10;
}else{
sum=sum+Integer.valueOf(end);
}
return(sum%11==0)?
true:
false;
}
/**
*将字符数组转换成数字数组
*
*@paramca
*字符数组
*@return数字数组
*/
publicstaticint[]converCharToInt(char[]ca){
intlen=ca.length;
int[]iArr=newint[len];
try{
for(inti=0;i iArr[i]=Integer.parseInt(String.valueOf(ca[i])); } }catch(NumberFormatExceptione){ e.printStackTrace(); } returniArr; } /** *将身份证的每位和对应位的加权因子相乘之后,再得到和值 * *@paramiArr *@return身份证编码。 */ publicstaticintgetPowerSum(int[]iArr){ intiSum=0; if(power.length==iArr.length){ for(inti=0;i for(intj=0;j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 身份证号码 18 15 转换