身份证号合法性验证

此方法主要验证身份证号的合法性

方法定义

1
2
3
4
5
6
7
8
9
10
11
#import <Foundation/Foundation.h>
@interface NSString (Extension)
/**
* 身份证识别
*
* @param cardNo 身份证号
*
* @return 是否正确
*/
+ (BOOL)checkIdentityCardNo:(NSString *)cardNo;
@end

方法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#import "NSString+Extension.h"
@implementation NSString (Extension)
#pragma mark - 身份证识别
/**
* 身份证合法性验证
*
* @param cardNo 身份证号
*
* @return 是否合法【1-合法,0-不合法】
*/
+ (BOOL)checkIdentityCardNo:(NSString *)cardNo {
if (cardNo.length != 18) {
return NO;
}
NSArray *codeArray = [NSArray
arrayWithObjects:@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6",
@"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2", nil];
NSDictionary *checkCodeDic = [NSDictionary
dictionaryWithObjects:[NSArray arrayWithObjects:@"1", @"0", @"X", @"9",
@"8", @"7", @"6", @"5",
@"4", @"3", @"2", nil]
forKeys:[NSArray arrayWithObjects:@"0", @"1", @"2", @"3",
@"4", @"5", @"6", @"7",
@"8", @"9", @"10", nil]];
NSScanner *scan = [NSScanner scannerWithString:[cardNo substringToIndex:17]];
int val;
BOOL isNum = [scan scanInt:&val] && [scan isAtEnd];
if (!isNum) {
return NO;
}
int sumValue = 0;
for (int i = 0; i < 17; i++) {
sumValue += [[cardNo substringWithRange:NSMakeRange(i, 1)] intValue] *
[[codeArray objectAtIndex:i] intValue];
}
NSString *strlast = [checkCodeDic
objectForKey:[NSString stringWithFormat:@"%d", sumValue % 11]];
if ([strlast isEqualToString:[[cardNo substringWithRange:NSMakeRange(17, 1)]
uppercaseString]]) {
return YES;
}
return NO;
}