美文网首页
根据身份证号自动得出性别和年龄

根据身份证号自动得出性别和年龄

作者: 武个武6个武 | 来源:发表于2017-03-31 17:52 被阅读0次

项目需求是用户输入身份证号自动匹配出年龄和性别
首先是要判断身份证号是否合法

#pragma mark -- 判断身份证号是否合法
- (BOOL)judgeIdentityStringValid:(NSString *)identityString {
    
    if (identityString.length != 18) return NO;
    // 正则表达式判断基本 身份证号是否满足格式
    NSString *regex2 = @"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";
    NSPredicate *identityStringPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
    //如果通过该验证,说明身份证格式正确,但准确性还需计算
    if(![identityStringPredicate evaluateWithObject:identityString]) return NO;
    
    //** 开始进行校验 *//
    
    //将前17位加权因子保存在数组里
    NSArray *idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
    
    //这是除以11后,可能产生的11位余数、验证码,也保存成数组
    NSArray *idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
    
    //用来保存前17位各自乖以加权因子后的总和
    NSInteger idCardWiSum = 0;
    for(int i = 0;i < 17;i++) {
        NSInteger subStrIndex = [[identityString substringWithRange:NSMakeRange(i, 1)] integerValue];
        NSInteger idCardWiIndex = [[idCardWiArray objectAtIndex:i] integerValue];
        idCardWiSum+= subStrIndex * idCardWiIndex;
    }
    
    //计算出校验码所在数组的位置
    NSInteger idCardMod=idCardWiSum%11;
    //得到最后一位身份证号码
    NSString *idCardLast= [identityString substringWithRange:NSMakeRange(17, 1)];
    //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
    if(idCardMod==2) {
        if(![idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]) {
            return NO;
        }
    }
    else{
        //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
        if(![idCardLast isEqualToString: [idCardYArray objectAtIndex:idCardMod]]) {
            return NO;
        }
    }
    return YES;
}

然后是在网上找到得到性别的方法

-(NSString *)sexStrFromIdentityCard:(NSString *)numberStr{
    NSString *result = nil;
    BOOL isAllNumber = YES;
    if([numberStr length]<17)
        return result;
    //**截取第17为性别识别符
    NSString *fontNumer = [numberStr substringWithRange:NSMakeRange(16, 1)];
    //**检测是否是数字;
    const char *str = [fontNumer UTF8String];
    const char *p = str;
    while (*p!='\0') {
        if(!(*p>='0'&&*p<='9'))
            isAllNumber = NO;
        p++;
    }
    if(!isAllNumber)
        return result;
    int sexNumber = [fontNumer integerValue];
    if(sexNumber%2==1)
        result = @"男";
    ///result = @"M";
    else if (sexNumber%2==0)
        result = @"女";
    //result = @"F";
    return result;
}

没有找到正确的得出年龄的方法
所以就自己一步一步截取字符串 拼接 最后得出年龄 觉得会有更好的方法

-(NSString *)ageStrFromIdentityCard:(NSString *)numberStr{
    if (numberStr.length > 0) {//身份证号为******19920319****
        NSString *dateSt = [numberStr substringWithRange:NSMakeRange(6, 8)];//19920319
        NSMutableString *dateS = [NSMutableString stringWithFormat:@"%@", dateSt];
        [dateS insertString:@"-" atIndex:4];//1992-0319
        [dateS insertString:@"-" atIndex:7];//1992-03-19
        
        NSString *dateStr = [NSString stringWithFormat:@"%@ 00:00:01",dateS];
        NSCalendar *calendar = [NSCalendar currentCalendar];
        // 需要对比的时间数据
        NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth
        | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
        NSDateFormatter *format=[[NSDateFormatter alloc] init];
        [format setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSDate *fromdate=[format dateFromString:dateStr];
        NSTimeZone *fromzone = [NSTimeZone systemTimeZone];
        NSInteger frominterval = [fromzone secondsFromGMTForDate: fromdate];
        NSDate *fromDate = [fromdate  dateByAddingTimeInterval: frominterval];
        NSLog(@"fromdate=%@",fromDate);
        NSDate *date = [NSDate date];
        NSTimeZone *zone = [NSTimeZone systemTimeZone];
        NSInteger interval = [zone secondsFromGMTForDate: date];
        NSDate *localeDate = [date  dateByAddingTimeInterval: interval];
        NSLog(@"enddate=%@",localeDate);
        NSDateComponents *components = [calendar components:unit fromDate:fromDate toDate:localeDate options:0];
        NSInteger year = [components year];//年
        NSLog(@"%d",year);
        return [NSString stringWithFormat:@"%d",year];
    }
    return nil;
}

相关文章

网友评论

      本文标题:根据身份证号自动得出性别和年龄

      本文链接:https://www.haomeiwen.com/subject/ddvvottx.html