2019年12月21日 星期六

身分證字號檢驗方式 (JAVA)

身分證字號驗證方式:
身分證字號的每個字元代表的意義如下:A123456789


(1)第一個字元為英文字,代表地區,可拆成兩個數字代碼

A=10 台北市  E=14 高雄市   I=34 嘉義市  M=21 南投縣 Q=24 嘉義縣   U=28 花蓮縣   Y=31 陽明山
B=11 台中市  F=15台北縣   J=18 新竹縣  N=22 彰化縣  R=25 台南縣   V=29 台東縣   Z=33 連江縣
C=12 基隆市  G=16 宜蘭縣  K=19 苗栗縣 O=35 新竹市  S=26 高雄縣   W=32 金門縣            
D=13 台南市  H=17桃園縣  L=20 台中縣  P=23 雲林縣   T=27 屏東縣   X=30 澎湖縣
        
(2)第二個字元為數字,1表示男性,2表示女性
(3)第三到第九個字元為數字
(4)第四個字元為檢查碼

將第一個英文拆解為兩個數字代碼後,共十一位數,後一位檢查碼9不計
A12345678 => 1012345678
乘以權數
1x1,0x9,1x8,2x7,3x6.4x5,5x4,6x3,7x2,8x1 =121
除以10取餘數
121/10 =12...1
驗證
10-1 = 9 與驗證碼相同


import java.util.Scanner;

public class chkid {

public static void main(String[] args) {
// TODO Auto-generated method stub
while (true) {
Scanner sc = new Scanner(System.in);
System.out.print("請輸入身份證字號:");

String id = sc.next();
id = id.toUpperCase();
int id1 = id.charAt(1)-'0';

//驗證輸入格式是否正確

if(!id.matches("[A-Z]\\d{9}")) {                      //一個英文字加九個數字
System.out.println("輸入格式錯誤!");
continue;
}

if(id1!= 1 && id1 != 2) {                                 //第一個數字為1或2
System.out.println("輸入格式錯誤!");
continue;
}

//驗證演算法是否正確

String s = "ABCDEFGHJKLMNPQRSTUVXYWZIO";
int id00 = (s.indexOf(id.charAt(0))+10)/10;
int id01 = (s.indexOf(id.charAt(0))+10)%10;
int id9 = id.charAt(9)-'0';
int sum = 0;

for(int i=1,j=8;i<9;i++) {
sum += (id.charAt(i)-'0')*j;
j--;
}
sum = sum + id00*1 + id01*9;

if(sum%10 == 10-id9) {
System.out.print("身分證驗證正確!");
break;
}
else if(sum%10==0 && id9==0) {
System.out.print("身分證驗證正確!");
break;
}
else {
System.out.print("身分證驗證錯誤!");
break;
}
}
}

}

沒有留言:

張貼留言