1. 程式人生 > >Java 身份證驗證工具

Java 身份證驗證工具

package com.dataservice.utils;

/**
 * 身份證驗證的工具(支援5位或18位省份證) 身份證號碼結構: 17位數字和1位校驗碼:6位地址碼數字,8位生日數字,3位出生時間順序號,1位校驗碼。
 * 地址碼(前6位):表示物件常住戶口所在縣(市、鎮、區)的行政區劃程式碼,按GB/T2260的規定執行。 出生日期碼,(第七位
 * 至十四位):表示編碼物件出生年、月、日,按GB按GB/T7408的規定執行,年、月、日程式碼之間不用分隔符。
 * 順序碼(第十五位至十七位):表示在同一地址碼所標示的區域範圍內,對同年、同月、同日出生的人編訂的順序號, 順序碼的奇數分配給男性,偶數分配給女性。
 * 校驗碼(第十八位數): 十七位數字本體碼加權求和公式 s = sum(Ai*Wi), i = 0,,16,先對前17位數字的權求和;
 * Ai:表示第i位置上的身份證號碼數字值.Wi:表示第i位置上的加權因.Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2;
 * 計算模 Y = mod(S, 11) 通過模得到對應的校驗碼 Y: 0 1 2 3 4 5 6 7 8 9 10 校驗碼: 1 0 X 9 8 7 6 5
 * 4 3 2
 */
public class CidCheckTools { final static int[] PARITYBIT = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; final static int[] POWER_LIST = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; /** * 身份證驗證 * * @param s * 號碼內容 * @return 是否有效 null和"" 都是false */
public static boolean isIDCard(String certNo) { if (certNo == null || (certNo.length() != 15 && certNo.length() != 18)) return false; final char[] cs = certNo.toUpperCase().toCharArray(); // 校驗位數 int power = 0; for (int i = 0; i < cs.length; i++) { if
(i == cs.length - 1 && cs[i] == 'X') break;// 最後一位可以 是X或x if (cs[i] < '0' || cs[i] > '9') return false; if (i < cs.length - 1) { power += (cs[i] - '0') * POWER_LIST[i]; } } // 校驗"校驗碼" if (certNo.length() == 15) { return true; } return cs[cs.length - 1] == PARITYBIT[power % 11]; } }