ID number verification and upgrade
1. 18-digit ID card
Citizen's 18-digit ID number consists of: address code (6 digits) + date of birth code (8 digits) + sequence code (3 digits) + check code (1 digit)
address code
1-2 codes of provinces, autonomous regions and municipalities directly under the Central Government
3-4 codes of prefecture-level cities, leagues and autonomous prefectures
5-6 codes of counties, county-level cities and districts
sequence code
Indicates the sequence numbers assigned to people born in the same year, month, and day within the area identified by the same address code. The odd number of the sequence code is assigned to males, and the even numbers are assigned to females.
check code
As the check digit of the tail number, it is calculated by the number compiling unit according to a unified formula. The calculation formula is as follows:
Two, 15 ID cards
The first-generation ID card is 15 digits, of which six digits are the address code (same as 18 digits), but the date of birth is only the year, without the century 19, the three-digit sequence code, and no check code.
When upgrading, you need to add century 19 after the six-digit address code (because the 15-digit ID cards are all before 2000, and the ID cards after that are all 18-digit), and a check code is also generated .
18-digit ID number verification
Boolean verifyIdNumber(String idNumber) { def city = [11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江 ", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北 ", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏 ", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外 "] if (!(idNumber?.matches(/^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/))) { return false } else if (!city[Integer.parseInt(idNumber?.substring(0, 2))]) { return false } else { if (idNumber?.length() == 18) { def factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] def parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] def sum = 0 def ai = 0 def wi = 0 for (int i = 0; i < 17; i++) { ai = Integer.parseInt(String.valueOf(idNumber?.charAt(i))) wi = factor[i] sum += ai * wi } def index = sum % 11 if (index == 2 && idNumber[17] != 'x' && idNumber[17] != 'X') { return false } if (index != 2 && parity[index] != idNumber[17]) { return false } } } return true }
15位身份证号码升级
def getNewIdNumber(String oldId) { if(oldId && oldId.matches(/^\d{15}$/)) { StringBuilder newId = new StringBuilder() newId.append(oldId.substring(0, 6)).append("19").append(oldId.substring(6)) newId.append(getVerifyCode(newId.toString())) // 18位身份证号码校验 if (verifyIdNumber(newId.toString())) { return newId.toString() } } } def getVerifyCode(String oldId) { def factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] def parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] def sum = 0 def ai = 0 def wi = 0 for (int i = 0; i < 17; i++) { ai = Integer.parseInt(String.valueOf(oldId?.charAt(i))) wi = factor[i] sum += ai * wi } def index = sum % 11 return parity[index] }