身份證轉換是指將15位身份證號碼轉換成18位身份證號碼的一種操作。身份證是中國公民證明身份的重要證件,而目前大多數機構需要使用18位身份證號碼進行識別和驗證。下面將會從多個方面闡述身份證轉換的細節和注意事項。
一、轉換規則
1、15位身份證號碼的規則:
第1-2位為數字表示所在省(直轄市、自治區)的行政區劃代碼,採用GB/T 2260;
第3-4位為數字表示所在市(地區)的行政區劃代碼,採用GB/T 2260;
第5-6位為數字表示所在區(縣、自治縣、縣級市)的行政區劃代碼,採用GB/T 2260;
第7-8位為數字表示出生年份,採用YY表示法;
第9-10位為數字表示出生月份,採用MM表示法;
第11-12位為數字表示出生日,採用DD表示法;
第13-15位為順序號,其中15位男為單數,女為雙數;
2、18位身份證號碼的規則:
第1-6位為數字表示所在省(直轄市、自治區)的行政區劃代碼,採用GB/T 2260;
第7-10位為數字表示所在市(地區)的行政區劃代碼,採用GB/T 2260;
第11-12位為數字表示所在區(縣、自治縣、縣級市)的行政區劃代碼,採用GB/T 2260;
第13-14位為數字表示出生年份,採用YY表示法;
第15-16位為數字表示出生月份,採用MM表示法;
第17-18位為數字表示出生日,採用DD表示法;
第19-20位為數字表示所在地出生的順序號,同時兼顧性別,其中女性的順序號為奇數,男性的順序號為偶數,即偶數為男性,奇數為女性;
第18位為校驗碼,使用ISO 7064:1983.MOD 11-2校驗碼系統計算出來的碼數;
二、轉換方法
1、生成校驗碼:身份證校驗碼基於ISO 7064:1983.MOD 11-2校驗碼系統,具體方法為:
將前17位數分別乘以不同的係數,其中第18個係數為2,然後將所得的18個乘積相加,用加和代替校驗碼位置上的數字,如果相加結果尾數為10,則校驗碼為X;
2、轉換過程:
(1)將15位身份證號碼的前6位升級到18位身份證的前6位升級(省/自治區/直轄市代碼);
(2)增加第七、八位為「19」(年份升級前兩位為19);
(3)將15位身份證的第7-12位補0,對應18位身份證的第9-14位(出生年月日);
(4)增加一位順序號,男性為奇數,女性為偶數,對應18位身份證的第17位;
(5)生成校驗碼,對應18位身份證的第18位。
三、代碼實現
public static String idCard15To18(String idCard){
String idCard18 = "";
if(idCard.length() != 15){
return null;
}
if(!isDigit(idCard)){
return null;
}
String provinceCode = idCard.substring(0,2);
String cityCode = idCard.substring(2, 4);
String districtCode = idCard.substring(4, 6);
String birthCode = "19" + idCard.substring(6, 12);
String orderCode = getGenderCode(idCard.substring(14, 15));
String verifyCode = getVerifyCode(idCard.substring(0,17));
idCard18 = provinceCode + cityCode + districtCode + birthCode + orderCode + verifyCode;
return idCard18;
}
private static boolean isDigit(String str) {
return str.matches("^[0-9]*$");
}
private static String getGenderCode(String str) {
int genderNum = Integer.parseInt(str);
if (genderNum % 2 == 0) {
return "2";
} else {
return "1";
}
}
private static String getVerifyCode(String id17) {
String[] sigma = new String[]{"1","0","X","9","8","7","6","5","4","3","2"};
String[] coefficient = new String[]{"7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2","1"};
int sum = 0;
for(int i=0;i<17;i++){
sum += Integer.parseInt(id17.substring(i,i+1)) * Integer.parseInt(coefficient[i]);
}
int remainder = sum % 11;
return sigma[remainder];
}
四、注意事項
1、轉換後的18位身份證號碼需要進行校驗,以保證其真實性和有效性;
2、在身份證轉換過程中,需要注意年份升級,一般為前兩位追加19;
3、由於身份證轉換主要是針對15位身份證號碼的轉換,因此在使用過程中要保證輸入的號碼長度為15位。
原創文章,作者:ICOCL,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/371921.html