[Java][LAB]身分證字號驗證

身分證字號驗證演算法

Definition:
我國目前所使用的身份證字號規格如下:


1. 第一位英文字母將對照一組二位數字,對照表如下:
 台北市 A 10  新竹市 O 35
 台中市 B 11  彰化縣 N 22
 基隆市 C 12  雲林縣 P 23
 台南市 D 13  嘉義縣 Q 24
 高雄市 E 14  台南縣 R 25
 台北縣 F 15  高雄縣 S 26
 宜蘭縣 G 16  屏東縣 T 27
 桃園縣 H 17  花蓮縣 U 28
 新竹縣 J 18  台東縣 V 29
 苗栗縣 K 19  澎湖縣 X 30
 台中縣 L 20  陽明山 Y 31
 南投縣 M 21  嘉義市 I 34
2. 將所得二位數字加剩餘的九位數字前八位由左至右做乘法計算:
 第1位*1、第2位*9、第3位*8、第4位*7 ... 第8位*1
 最後一位數因為是檢查碼,故不需計算
3. 將這十組乘積相加總
4. 將上式所得之總和除以十求餘數
5. 用 10 減掉上式所得的餘數,即得檢查碼。

package com.practice.jerry;
import java.math.*;
import java.util.*;


public class IDidentify{
	
	static char[] characterArray=new char[26];//A-Z
	static int[] numberArray = {10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,32};//A-Z對應的數字
	static int[] stringToIntArray=new int[26];//放輸入的字串
	public static void main(String[] args) {
	insertCharacter();//插入英文字母
	
	String inputString=getInput();//輸入身分證字號

	check(inputString);//開始檢查
	System.out.println(inputString);	

	
	}
	
	static String getInput(){
		System.out.println("請輸入身分證字號");
		Scanner sc=new Scanner(System.in);
		String idArray =sc.nextLine().toUpperCase();//無論如何轉大寫
		
		return idArray;//回傳字串
	}
	 static void check(String a){
 
		int index=0;
		String inputString=a;//丟進來的身分證字串
		Character firstLetter= inputString.charAt(0);//抓出字串第一個英文
		for(int i=1;i<=inputString.length()-1;i++){
			stringToIntArray[i]=(int)(inputString.charAt(i))-48;//把身分證字號放入stringToIntArray[],inputString.charAt(i)裡面的是字元1->49所以減48int 1
			
			System.out.println(stringToIntArray[i]);//偷偷檢查自己有沒有抓到
		}
		index=Arrays.binarySearch(characterArray,firstLetter);//輸入的第一個英文字母判斷她是在characterArray中的第幾個index
		int d0=numberArray[index];//對應到的數字抓出來放入d0
		int x2=(d0)%10;//d0的個位數
		int x1=(int)Math.floor((d0)/10);//d0的十位數
	
		int result=x1+(9*x2)+(8*stringToIntArray[1])+(7*stringToIntArray[2])+(6*stringToIntArray[3])+(5*stringToIntArray[4])+(4*stringToIntArray[5])+(3*stringToIntArray[6])+(2*stringToIntArray[7])+(stringToIntArray[8]);
		int checkCode=10-(result%10);
		
		if(stringToIntArray[9]==checkCode){
			System.out.println("身分證正確");
		}else{
			System.out.println("身分證錯誤");
		}

		
	}
	static void insertCharacter(){

		for(int i=0;i<=25;i++){
			characterArray[i]=(char) (65+i);//把英文字母放入字元陣列,強制轉型A->65	
		}

	}

當時遇到的bug,數字與字元轉換上的問題