根據(jù)身份證號自動得出性別和年齡

項目需求是用戶輸入身份證號自動匹配出年齡和性別
首先是要判斷身份證號是否合法

#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位加權(quán)因子保存在數(shù)組里
    NSArray *idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
    
    //這是除以11后,可能產(chǎn)生的11位余數(shù)、驗證碼,也保存成數(shù)組
    NSArray *idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
    
    //用來保存前17位各自乖以加權(quán)因子后的總和
    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;
    }
    
    //計算出校驗碼所在數(shù)組的位置
    NSInteger idCardMod=idCardWiSum%11;
    //得到最后一位身份證號碼
    NSString *idCardLast= [identityString substringWithRange:NSMakeRange(17, 1)];
    //如果等于2,則說明校驗碼是10,身份證號碼最后一位應(yīng)該是X
    if(idCardMod==2) {
        if(![idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]) {
            return NO;
        }
    }
    else{
        //用計算出的驗證碼與最后一位身份證號碼匹配,如果一致,說明通過,否則是無效的身份證號碼
        if(![idCardLast isEqualToString: [idCardYArray objectAtIndex:idCardMod]]) {
            return NO;
        }
    }
    return YES;
}

然后是在網(wǎng)上找到得到性別的方法

-(NSString *)sexStrFromIdentityCard:(NSString *)numberStr{
    NSString *result = nil;
    BOOL isAllNumber = YES;
    if([numberStr length]<17)
        return result;
    //**截取第17為性別識別符
    NSString *fontNumer = [numberStr substringWithRange:NSMakeRange(16, 1)];
    //**檢測是否是數(shù)字;
    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];
        // 需要對比的時間數(shù)據(jù)
        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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容