身分證字號驗證方式:
身分證字號的每個字元代表的意義如下: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表示女性
(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;
}
}
}
}
沒有留言:
張貼留言