iOS开发之检查身份证是否合法,不区分大小写x

来源:互联网 发布:淘宝店铺怎么开通 编辑:程序博客网 时间:2024/04/28 10:52

+ (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) {        case15:            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)];            //            [regularExpressionrelease];                        if(numberofMatch >0) {                return YES;            }else {                return NO;            }        case18:                        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 false;    }}


0 0