身份证验证
2015-07-08 12:58
447 查看
+ (BOOL)validateIDCardNumber:(NSString *)value {
value = [value 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
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;
}
}
value = [value 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
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;
}
}
相关文章推荐
- Objective-C的内省(Introspection)用法小结
- Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析
- Objective-C中NSLog输出格式大全
- Swift调用Objective-C编写的API实例
- Swift、Objective-C、Cocoa混合编程设置指南
- Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍
- Swift调用Objective-C代码
- objective-c中生成随机数的方法
- 在Swift中使用Objective-C编写类、继承Objective-C类
- Swift能代替Objective-C吗?
- Objective-C 消息传递机制详解
- 在一个项目中同时使用Swift和Objective-C代码混合编程的方法
- vm安装mac os x 10.7 lion
- objective-c(一)
- objective-c(二)
- objective-c(三)
- objective-c(四)-基本数据类型以及循环和选择结构
- objective-c(六)文件分离,合成存取方法,方法多参数,局部变量,self使用(未完成)
- windows下objective-c的cocoa框架编程,可以有图形界面哟