1. 程式人生 > >最嚴格的身份證校驗

最嚴格的身份證校驗

國外 equal ppr ron 新疆 false elseif tor 河南

import java.util.Date;

/**

* 校驗身份證號碼是否有效

*

* @author GaoHuanjie

*/

public class CheckCertificateNo {

@SuppressWarnings("deprecation")

publicstaticvoid main(String[] args) {

String certificateNo = "61072919761109762X";//身份證號碼

if(certificateNo.length() == 15){

System.err.println("身份證號碼無效,請使用第二代身份證!!!");

}elseif(certificateNo.length() == 18){

String address = certificateNo.substring(0,6);//6位,地區代碼

String birthday = certificateNo.substring(6,14);//8位,出生日期

String sequenceCode = certificateNo.substring(14,17);//3位,順序碼:奇為男,偶為女

String checkCode = certificateNo.substring(17);//1位,校驗碼:檢驗位

System.out.println("身份證號碼:"+certificateNo+"、地區代碼:"+address+"、出生日期:"+birthday+"、順序碼:"+sequenceCode+"、校驗碼:"+checkCode+"\n");

String [] provinceArray = {"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:國外"};

boolean valideAddress =false;

for (int i = 0; i < provinceArray.length; i++) {

String provinceKey =provinceArray[i].split(":")[0];

if (provinceKey.equals(address.substring(0,2))){

valideAddress = true;

}

}

if (valideAddress) {

Stringyear = birthday.substring(0,4);

String month =birthday.substring(4,6);

String day =birthday.substring(6);

Date tempDate = newDate(Integer.parseInt(year),Integer.parseInt(month)-1,Integer.parseInt(day));

if((tempDate.getYear()!=Integer.parseInt(year)|| tempDate.getMonth()!=Integer.parseInt(month)-1 || tempDate.getDate()!=Integer.parseInt(day))){//避免千年蟲問題

System.err.println("身份證號碼無效,請重新輸入!!!");

}else{

int [] weightedFactors = { 7, 9, 10, 5, 8, 4, 2,1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };//加權因子

int [] valideCode = { 1, 0, 10, 9, 8, 7, 6, 5,4, 3, 2 };//身份證驗證位值,其中10代表X

int sum = 0;//聲明加權求和變量

String []certificateNoArray =newString[certificateNo.length()];

for (int i = 0; i < certificateNo.length(); i++) {

certificateNoArray[i] =String.valueOf(certificateNo.charAt(i));

}

if ("x".equals(certificateNoArray[17].toLowerCase())) {

certificateNoArray[17] ="10";//將最後位為x的驗證碼替換為10

}

for (int i = 0; i < 17; i++) {

sum += weightedFactors[i]* Integer.parseInt(certificateNoArray[i]);//加權求和

}

int valCodePosition = sum % 11;//得到驗證碼所在位置

if (Integer.parseInt(certificateNoArray[17])== valideCode[valCodePosition]) {

String sex = "男";

if(Integer.parseInt(sequenceCode)%2==0){

sex = "女";

}

System.out.println("身份證號碼有效,性別為:"+sex+"!");

} else {

System.err.println("身份證號碼無效,請重新輸入!!!");

}

}

} else {

System.err.println("身份證號碼無效,請重新輸入!!!");

}

}else{

System.err.println("非身份證號碼,請輸入身份證號碼!!!");

}

}

}

最嚴格的身份證校驗