18位身份證號碼最後一位校驗
阿新 • • 發佈:2018-02-23
void i++ apt div 身份證號碼 ++ print col str
1 package com.jdk7.chapter5; 2 3 /** 4 * 僅能校驗15位或18位身份證號的校驗碼 5 * @author Administrator 6 * 7 */ 8 public class IDCardTest { 9 private static final int[] weigth = new int[] {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; 10 private static final int[] checkCode = new int[] {1,0,‘x‘,9,8,7,6,5,4,3,2};11 12 /** 13 * 如果是15位身份證號則升級為18位身份證 14 * 然後統一對18為身份證號最後一位進行校驗,取18位身份證號最後一位和前17位通過公式計算的結果比較 15 * @param str 16 * @return 17 */ 18 public static boolean isIDcard(String str){ 19 if(str.length()==15){ 20 str = IDCardTest.updateID(str); 21 }22 if(str.length()!=18){ 23 return false; 24 } 25 String code = str.substring(17, 18); 26 if(code.equals(getCheck(str))){ 27 return true; 28 } 29 return false; 30 } 31 32 /** 33 * 1.15位的身份證號在出生年份前+19,組成17為數 34 * 2.再獲取17位數的驗證碼35 * 3.17位數+驗證碼組成18位的身份號 36 * @param fifteenstr 37 * @return 38 */ 39 public static String updateID(String fifteenstr){ 40 StringBuffer sb = new StringBuffer(); 41 String eigthteen = fifteenstr.substring(0, 6); 42 eigthteen = (sb.append(eigthteen).append("19").append(fifteenstr.substring(6, 15))).toString(); 43 eigthteen = eigthteen + getCheck(eigthteen); 44 return eigthteen; 45 } 46 47 /** 48 * 對參數前17位進行校驗碼計算: 49 * 18位身份證號由17位數字體+1位校驗碼組成,排列從左至右依次為:6位地區代碼+8位出生日期+3位順序碼+1為校驗碼 50 * 3位順序碼為同一天出生序號,奇數為男性,偶數為女性 51 * 身份證校驗碼的關鍵技術為: 52 * 對前17數字本體碼和加權求和,S=Sum(Ai*Wi),i=0...16,Ai表示第i個位置上身份證號碼對應的數字,Wi表示第i個位置上加權因子對應值 53 * 加權因子從0到16的值分別為7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 54 * 對S取模,Y=mod(S,11) 55 * 通過Y獲取校驗碼,Y對應的值即為校驗碼,對應關系為如下: 56 * <0,1>、<1,0>、<2,x>、<3,9>、<4,8>、<5,7>、<6,6>、<7,5>、<8,4>、<9,3>、<10,2> 57 * 對應關系中前者為Y,後者為校驗碼 58 * @param str 59 * @return 60 */ 61 public static String getCheck(String str){ 62 63 if(str.length()==18){ 64 str = str.substring(0, 17); 65 } 66 int Y = 0; 67 if(str.length()==17){ 68 int[] a = new int[str.length()]; 69 int sum = 0; 70 for(int i=0;i<str.length();i++){ 71 a[i] = Integer.parseInt(str.substring(i, i+1)); 72 sum = sum + (a[i] * weigth[i]); 73 } 74 Y = sum % 11; 75 } 76 return (Y==2)?"x":String.valueOf(checkCode[Y]); 77 } 78 79 public static void main(String[] args) { 80 String id = "110105198709191369"; 81 // String id = "110105870919136"; 82 System.out.println(id+"校驗碼是否通過?"+IDCardTest.isIDcard(id)); 83 } 84 } 85 86 執行結果: 87 110105198709191369校驗碼是否通過?true
18位身份證號碼最後一位校驗