您的位置:首页 > 移动开发 > IOS开发

身份证号码有效性检测

2017-03-21 16:23 190 查看

身份证号码有效性检测

在开发软件的时候有些注册需要身份证号等信息,并且要求号码的正确性。

简单的身份证号码有效性检测

- (BOOL)verifyIdentityCardNum {
NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
return [self q_isValidateByRegex:regex2];
}


精确的身份证号码有效性检测

- (BOOL)verifyIdentityCardNum {

NSString *value = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

int length =0;
if (!value) {
return NO;
} else {
length = (int)value.length;

if (length !=15 && length !=18) {
return NO;
}
}

// 省份代码
NSArray *areasArray =@[@"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"];

NSString *valueStart2 = [value substringToIndex:2];
BOOL areaFlag =NO;
for (NSString *areaCode in areasArray) {
if ([areaCode isEqualToString:valueStart2]) {
areaFlag =YES;
break;
}
}

if (!areaFlag) {
return false;
}

NSRegularExpression *regularExpression;
NSUInteger numberofMatch;

int year =0;
switch (length) {
case 15:
year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900;

if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {

// 测试出生日期的合法性
regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$"
options:NSRegularExpressionCaseInsensitive
error:nil];
} else {

// 测试出生日期的合法性
regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$"
options:NSRegularExpressionCaseInsensitive
error:nil];
}
numberofMatch = [regularExpression numberOfMatchesInString:value
options:NSMatchingReportProgress
range:NSMakeRange(0, value.length)];

if (numberofMatch >0) {
return YES;
} else {
return NO;
}
case 18:
year = [value substringWithRange:NSMakeRange(6,4)].intValue;
if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {

// 测试出生日期的合法性
regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$"
options:NSRegularExpressionCaseInsensitive
error:nil];
} else {

// 测试出生日期的合法性
regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$"
options:NSRegularExpressionCaseInsensitive

4000
error:nil];
}
numberofMatch = [regularExpression numberOfMatchesInString:value
options:NSMatchingReportProgress
range:NSMakeRange(0, value.length)];

if (numberofMatch > 0) {
int S = ([value substringWithRange:NSMakeRange(0, 1)].intValue +
[value substringWithRange:NSMakeRange(10, 1)].intValue) * 7 +
([value substringWithRange:NSMakeRange(1, 1)].intValue +
[value substringWithRange:NSMakeRange(11, 1)].intValue) * 9 +
([value substringWithRange:NSMakeRange(2, 1)].intValue +
[value substringWithRange:NSMakeRange(12, 1)].intValue) * 10 +
([value substringWithRange:NSMakeRange(3, 1)].intValue +
[value substringWithRange:NSMakeRange(13, 1)].intValue) * 5 +
([value substringWithRange:NSMakeRange(4, 1)].intValue +
[value substringWithRange:NSMakeRange(14, 1)].intValue) * 8 +
([value substringWithRange:NSMakeRange(5, 1)].intValue +
[value substringWithRange:NSMakeRange(15, 1)].intValue) * 4 +
([value substringWithRange:NSMakeRange(6, 1)].intValue +
[value substringWithRange:NSMakeRange(16, 1)].intValue) * 2 +
[value substringWithRange:NSMakeRange(7, 1)].intValue * 1 +
[value substringWithRange:NSMakeRange(8, 1)].intValue * 6 +
[value substringWithRange:NSMakeRange(9, 1)].intValue * 3;
int Y = S % 11;
NSString *M =@"F";
NSString *JYM =@"10X98765432";
M = [JYM substringWithRange:NSMakeRange(Y,1)];  // 判断校验位
if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) {
return YES;                                 // 检测 ID 的校验位
} else {
return NO;
}

} else {
return NO;
}
default:
return NO;
}
}


银行卡号、ip 地址、车牌号等等正则会持续更新上去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息