计算方法 (<u>百度百科</u>)
将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
将这17位数字和系数相乘的结果相加。
用加出来和除以11,看余数是多少?
余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即馀数0对应1,馀数1对应0,馀数2对应X...)
-
通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。
例如:某男性的身份证号码为【53010219200508011x】, 我们看看这个身份证是不是合法的身份证。
首先我们得出前17位的乘积和【(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)】是189,然后用189除以11得出的结果是189/11=17----2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。
-
JS
function testIdCard (id){ var reg = /^[1-6][0-7][\d]{4}((19[\d]{2})|(20[0-1][\d]))((0[1-9])|(1[0-2]))((0[1-9])|([1-2]\d)|(3[0-1]))[\d]{3}[\dx]$/; var isFormatMatch = reg.test(id); if (!isFormatMatch) { console.log("base format does not match ID Card"); return false; }; var ids = id.split(""); var modulus = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2] var matchLast = [1,0,"X",9,8,7,6,5,4,3,2] var sum = 0; for (var i = 0; i < modulus.length; i++) { sum += (modulus[i] * ids[i]); }; var checksum = matchLast[sum % 11]; if (checksum != ids[ids.length-1].toUpperCase()) { console.log("error: checknum does not match"); return false; } return true; } var MATCH = testIdCard('110325198006173638'); console.log(MATCH ? "MATCH" : "DOES NOT MATCH");
-
Object-C
-(BOOL)isIDCard:(NSString *)ID { NSString * reg = @"(^[1-6][0-7][\\d]{4}((19[\\d]{2})|(20[0-1][\\d]))((0[1-9])|(1[0-2]))((0[1-9])|([1-2]\\d)|(3[0-1]))[\\d]{3}[\\dx]$)"; NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", reg]; if (![predicate evaluateWithObject:ID]) { return NO; } NSMutableArray *ids = [NSMutableArray arrayWithCapacity:18]; for (int i = 0; i < ID.length; i++) { NSString *str = [ID substringWithRange:NSMakeRange(i, 1)]; [ids addObject:str]; } NSArray *modulus = @[@7,@9,@10,@5,@8,@4,@2,@1,@6,@3,@7,@9,@10,@5,@8,@4,@2]; NSArray *matchLst = @[@1,@0,@10,@9,@8,@7,@6,@5,@4,@3,@2]; NSInteger sum = 0; for (int i = 0; i < modulus.count; i++) { sum += ([modulus[i] integerValue] * [ids[i] integerValue]); }; NSInteger check = [matchLst[sum%11] integerValue]; if ([[ids.lastObject uppercaseString] isEqualToString:@"X"]) { if (check != 10) { return NO; } }else{ if ([ids.lastObject integerValue] != check) { return NO; } } return YES; }