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

iOS 判断身份证号码

2016-06-21 09:27 363 查看
//判断身份证号码

+ (BOOL)validateIdentityCard: (NSString *)identityCard;

//精确判断身份证号码

+ (BOOL)validateIDCardNumber:(NSString *)identityCard;

//身份证号

+ (BOOL)validateIdentityCard: (NSString *)identityCard

{

    BOOL flag = NO;

    if (identityCard.length <=
0) {

        return flag;

    }

    NSString *regex2 =
@"^(\\d{14}|\\d{17})(\\d|[xX])$";

    NSPredicate *identityCardPredicate = [NSPredicate
predicateWithFormat:@"SELF MATCHES %@",regex2];

    flag = [identityCardPredicate evaluateWithObject:identityCard];

    return flag;

}

+ (BOOL)validateIDCardNumber:(NSString *)value {

    value = [value stringByTrimmingCharactersInSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet]];

    

    NSInteger length =
0;

    if (!value) {

        return NO;

    }else {

        length = 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;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: