iOS判断身份证号码是否正确的方法
在iOS开发中,判断身份证号码是否正确是非常常见的需求。它涉及到身份证号码的规则校验和部分解析。以下是判断身份证号码是否正确的方法:
校验规则
首先,我们需要了解身份证号码的校验规则。根据国家标准《GB 11643-1999》规定,身份证号码共计18位,其中前17位为地区码和出生日期码,第18位为校验位。其中,校验位的计算规则如下:
- 将前17位数字分别乘以对应的系数,相加得到结果;
- 将结果除以11,得到余数;
- 根据余数查找校验码表,得到校验位。
校验码表如下:
余数 | 校验码 |
---|---|
0 | 1 |
1 | 0 |
2 | X |
3 | 9 |
4 | 8 |
5 | 7 |
6 | 6 |
7 | 5 |
8 | 4 |
9 | 3 |
10 | 2 |
校验代码
在了解校验规则后,我们可以编写校验代码。以下是校验代码的实现:
- (BOOL)validateIDCardNumber:(NSString *)value {
// 判断位数是否合法
if ([value length] != 18) {
return NO;
}
// 判断地区码是否合法
NSArray *areaCodes = [self areaCodeList];
NSString *areaCode = [value substringToIndex:6];
BOOL isValidAreaCode = [areaCodes containsObject:areaCode];
if (!isValidAreaCode) {
return NO;
}
// 判断出生日期码是否合法
NSString *birthDateCode = [value substringWithRange:NSMakeRange(6, 8)];
BOOL isValidBirthDateCode = [self validateBirthDateCode:birthDateCode];
if (!isValidBirthDateCode) {
return NO;
}
// 判断校验位是否合法
NSString *checkCode = [value substringFromIndex:17];
BOOL isValidCheckCode = [self validateCheckCode:value];
if (!isValidCheckCode) {
return NO;
}
return YES;
}
- (NSArray *)areaCodeList {
// 地区码列表
return @[@"110000", @"120000", @"130000", @"140000", @"150000", @"210000", @"220000", @"230000", @"310000", @"320000", @"330000", @"340000", @"350000", @"360000", @"370000", @"410000", @"420000", @"430000", @"440000", @"450000", @"460000", @"500000", @"510000", @"520000", @"530000", @"540000", @"610000", @"620000", @"630000", @"640000", @"650000", @"710000", @"810000", @"820000"];
}
- (BOOL)validateBirthDateCode:(NSString *)value {
// NSDateFormatter解析日期
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyyMMdd";
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSDate *date = [formatter dateFromString:value];
// 判断是否解析成功且与当前日期相比是否早于当前日期
if (date != nil && [date compare:[NSDate date]] == NSOrderedAscending) {
return YES;
} else {
return NO;
}
}
- (BOOL)validateCheckCode:(NSString *)value {
// 根据规则计算校验位
NSArray *factors = @[@7, @9, @10, @5, @8, @4, @2, @1, @6, @3, @7, @9, @10, @5, @8, @4, @2];
NSInteger sum = 0;
for (int i = 0; i < 17; i++) {
int digit = [[value substringWithRange:NSMakeRange(i, 1)] intValue];
int factor = [factors[i] intValue];
sum += digit * factor;
}
NSInteger remainder = sum % 11;
NSArray *checkCodes = @[@"1", @"0", @"X", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
NSString *checkCode = checkCodes[remainder];
// 判断校验位是否匹配
if ([checkCode isEqualToString:[value substringFromIndex:17]]) {
return YES;
} else {
return NO;
}
}
在上面的代码中,我们实现了三个方法:
validateIDCardNumber:
:用于判断身份证号码是否正确,其中会调用下面两个方法;validateBirthDateCode:
:用于判断出生日期码是否合法;validateCheckCode:
:用于判断校验位是否合法。
示例说明
下面我们来通过两个示例说明身份证号码的校验。
示例一
对于身份证号码610404194404038238
,校验的结果应该为正确。
BOOL isValid = [self validateIDCardNumber:@"610404194404038238"];
NSLog(@"%@", isValid ? @"正确" : @"错误"); // 输出:正确
示例二
对于身份证号码110000194912310077
,校验的结果应该为错误。
BOOL isValid = [self validateIDCardNumber:@"110000194912310077"];
NSLog(@"%@", isValid ? @"正确" : @"错误"); // 输出:错误
通过上述代码和示例说明,我们可以看出,判断身份证号码是否正确并不复杂,只需要按照规则进行校验即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:iOS判断身份证号码是否正确的方法 - Python技术站