iOS 신분증 판단 정규 가산 법

9547 단어
신분증 상식
우리 나라 의 신분증 번 호 는 15 위 와 18 위 두 종류 로 나 뉜 다.신분증 은 국민 의 신분 번호 이 고 번 호 는 일정한 규칙 이 있다.주민등록번호, 중화 인민공화국 국가 표준 GB 11643 - 1999 에서 공민 신분 번호 에 관 한 규정 에 따라 공민 신분 번 호 는 특징 조합 코드 로 17 자리 디지털 본체 코드 와 1 자리 디지털 검사 코드 로 구성 된다.배열 순 서 는 왼쪽 에서 오른쪽으로 여섯 자리 숫자 주소 코드, 여덟 자리 숫자 생년월일 코드, 세 자리 숫자 순서 코드 와 한 자리 숫자 검사 코드 로 나 뉜 다.주민등록증 은 국가 가 법정 으로 공민의 개인 신분 을 증명 하 는 유효한 증명서 다.
구조 와 형식
1. 번호 의 구조
공민 신분 번 호 는 특징 조합 코드 로 17 자리 디지털 본체 코드 와 한 개의 검사 코드 로 구성 된다.배열 순 서 는 왼쪽 에서 오른쪽으로 여섯 자리 숫자 주소 코드, 여덟 자리 숫자 생년월일 코드, 세 자리 숫자 순서 코드 와 한 자리 숫자 검사 코드 로 나 뉜 다.
2. 주소 코드
인 코딩 대상 이 상주 호적 이 있 는 현 (시, 기, 구) 의 행정구 역 코드 를 나타 내 고 GB / T2260 의 규정 에 따라 집행 한다.
3. 생년월일
인 코딩 대상 이 태 어 난 해, 월, 일 을 나타 내 며 GB / T7408 의 규정 에 따라 집행 되 며 년, 월, 일 코드 간 에는 구분자 가 필요 하지 않 습 니 다.
4. 순서 코드
같은 주소 코드 에 표 시 된 지역 범위 내 에서 같은 해, 같은 달, 같은 날 에 태 어 난 사람 에 게 정 해진 순서 번 호 를 나타 내 고 순서 번호 의 기 수 는 남성 에 게 분배 되 며 짝수 는 여성 에 게 분배 된다.
5. 검사 코드
앞의 17 자리 숫자 에 따라 ISO 7064: 1983. MOD 11 - 2 검사 코드 에 따라 계 산 된 검사 코드 입 니 다.
주소
화북 지역: 북경 시 | 110000, 천진 시 | 120000, 하북성 | 130000, 산서성 | 140000, 내몽고 자치구 | 15000, 동북 지역: 요녕성 | 210000, 길림성 | 220000, 흑룡강성 | 230000, 화동 지역: 상해 시 | 310000, 강소성 | 320000, 절강성 | 330000, 안휘성 | 340000, 복건성 | 350000, 강서성 | 360000, 산동성 | 370000,화중 지역: 하남성 | 410000, 호북성 | 420000, 호남성 | 430000 화남 지역: 광동성 | 440000, 광서장족자치구 | 450000, 해남성 | 460000, 서남 지역: 충 칭 시 | 500000, 사천성 | 510000, 귀주성 | 520000, 운남성 | 530000, 티베트 자치 구 | 540000, 서북 지역: 섬서성 | 610000, 감숙성 | 620000, 청해성 | 630000,영하회족자치구 | 640000, 신장 위 구 르 자치구 | 650000, 특별 지역: 대만 지역 (886) | 710000, 홍콩 특별행정구 (852) | 810000, 마카오 특별행정구 (853) | 820000 중국 대륙 주민등록번호 중의 주소 코드 의 디지털 코드 규칙 은 1, 2 위 표시 성 (자치구, 직할시, 특별행정구) 이다.
3, 4 위 는 시 (지급 시, 자치주, 동맹 및 국가 직할시 소속 시 관할 구 와 현의 집계 코드) 를 나타 낸다. 그 중에서 01 - 20, 51 - 70 은 성 직할시, 21 - 50 은 지역 (자치주, 동맹) 을 나타 낸다.
다섯 번 째, 여섯 번 째 는 현 (시 관할 구, 현급 시, 기) 을 나타 낸다. 01 - 18 은 시 관할 구 또는 지역 (자치주, 맹) 이 현급 시 를 관할 하고 21 - 80 은 현 (기) 을 나타 내 며 81 - 99 는 성 직할 현급 시 를 나타 낸다.
7. 생년월일 코드
주민등록번호 7 위 부터 14 위 까지) 는 인 코딩 대상 이 태 어 난 해, 월, 일 을 나타 내 는데 그 중에서 연 도 는 네 자리 숫자 로 표시 하고 년, 월, 일 사이 에는 구분자 가 필요 없다. 예 를 들 어 1981 년 05 월 11 일 에 19810511 로 표시 한다.
8. 순서 코드
주민등록번호 15 위 부터 17 위 까지) 주소 번호 가 표 시 된 지역 범위 내 에서 같은 해, 월, 일 에 태 어 난 사람 에 대한 순서 번호.그 중 17 번 째 기 수 는 남성 에 게, 짝수 는 여성 에 게 나 누 어 주 었 다.
9. 검사 코드
끝자리 번호 인 체크 코드 는 번호 작성 단위 가 통 일 된 공식 에 따라 계산 한 것 으로 누군가의 끝자리 가 0 - 9 이면 X 가 나 오지 않 지만 끝자리 가 10 이면 X 로 대체 해 야 한다. 10 으로 끝자리 번 호 를 만 들 면 이 사람의 신분증 은 19 자리 가 되 고 19 명의 번 호 는 국가 표준 을 위반 하기 때문이다.또한 중국의 컴퓨터 응용 시스템 도 19 명의 신분증 번 호 를 인정 하지 않 는 다.X 는 로마 숫자의 10 으로 10 을 X 로 대체 하면 공민의 신분증 이 국가 표준 에 부합 하도록 보장 할 수 있다.
10. 신분증 검사 코드 의 계산 방법
1. 앞 에 있 는 주민등록번호 17 자 리 를 각각 다른 계수 로 곱 합 니 다.1 위 부터 17 위 까지 의 계 수 는 각각 7 - 9 - 10 - 5 - 8 - 4 - 2 - 1 - 6 - 7 - 9 - 10 - 5 - 8 - 4 - 2 이다.2. 이 17 자리 숫자 와 계 수 를 곱 한 결 과 를 더 합 니 다.3. 더하기 와 나 누 기 11 로 나머지 가 얼마 인지 볼 까요?4. 나머지 수 는 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 이라는 11 개의 숫자 만 있 을 수 있 습 니 다.각각 대응 하 는 마지막 신분증 의 번 호 는 1 - 0 - X - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 이다.(즉, 나머지 0 은 1, 나머지 1 은 0, 나머지 2 는 X...) 5. 나머지 가 3 이면 신분증 의 18 번 째 숫자 에 9 가 나 온 다 는 것 을 위 를 통 해 알 게 된다.대응 하 는 숫자 가 2 라면 신분증 의 마지막 번 호 는 로마 숫자 x 다.
코드 바로 붙 여 넣 기
#pragma mark -          
+ (BOOL)checkUserIDCard:(NSString *)value {
    value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSInteger length = 0;
    if (!value) {
        return NO;
    } else {
        length = value.length;
        //   15  18 ,      
        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 NO;
    }
    
    NSRegularExpression *regularExpression;
    NSUInteger numberofMatch;

    int year = 0;
    //  15 、18        
    switch (length) {
        case 15:
            //         
            year = [value substringWithRange:NSMakeRange(6, 2)].intValue + 1900;
            if (year %4 == 0 || (year %100 == 0 && year %4 == 0)) {
                //        NSRegularExpressionCaseInsensitive:           
                //          
                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];
            }
            //             NSMatchingReportProgress:             block  
            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[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\\d{4}(((19|20)\\d{2}(0[13-9]|1[012])(0[1-9]|[12]\\d|30))|((19|20)\\d{2}(0[13578]|1[02])31)|((19|20)\\d{2}02(0[1-9]|1\\d|2[0-8]))|((19|20)([13579][26]|[2468][048]|0[048])0229))\\d{3}(\\d|X|x)?$" options:NSRegularExpressionCaseInsensitive error:nil];
            } else {
                //          
                regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\\d{4}(((19|20)\\d{2}(0[13-9]|1[012])(0[1-9]|[12]\\d|30))|((19|20)\\d{2}(0[13578]|1[02])31)|((19|20)\\d{2}02(0[1-9]|1\\d|2[0-8]))|((19|20)([13579][26]|[2468][048]|0[048])0229))\\d{3}(\\d|X|x)?$" options:NSRegularExpressionCaseInsensitive error:nil];
            }
            numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, value.length)];
            
            if (numberofMatch > 0) {
                //1:              17           。               :7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。  17             。
                int S = [value substringWithRange:NSMakeRange(0, 1)].intValue * 7 + [value substringWithRange:NSMakeRange(10, 1)].intValue * 7 + [value substringWithRange:NSMakeRange(1, 1)].intValue * 9 + [value substringWithRange:NSMakeRange(11, 1)].intValue * 9 + [value substringWithRange:NSMakeRange(2, 1)].intValue * 10 + [value substringWithRange:NSMakeRange(12, 1)].intValue * 10 + [value substringWithRange:NSMakeRange(3, 1)].intValue * 5 + [value substringWithRange:NSMakeRange(13, 1)].intValue * 5 + [value substringWithRange:NSMakeRange(4, 1)].intValue * 8 + [value substringWithRange:NSMakeRange(14, 1)].intValue * 8 + [value substringWithRange:NSMakeRange(5, 1)].intValue * 4 + [value substringWithRange:NSMakeRange(15,1)].intValue * 4 + [value substringWithRange:NSMakeRange(6, 1)].intValue * 2 + [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;
                //2:       11,      ?      0-1-2-3-4-5-6-7-8-9-10 11   
                int Y = S %11;
                NSString *M = @"F";
                NSString *JYM = @"10X98765432";
                //3:     
                M = [JYM substringWithRange:NSMakeRange(Y, 1)];
                NSString *lastStr = [value substringWithRange:NSMakeRange(17, 1)];
                CMLog(@"%@",M);
                CMLog(@"%@",[value substringWithRange:NSMakeRange(17, 1)]);
                //4:  ID    
                if ([lastStr isEqualToString:@"x"]) {
                    if ([M isEqualToString:@"X"]) {
                        return YES;
                    } else {
                        return NO;
                    }
                } else {
                    if ([M isEqualToString:[value substringWithRange:NSMakeRange(17, 1)]]) {
                        return YES;
                    } else {
                        return NO;
                    }
                }
            } else {
                return NO;
            }
        default:
            return NO;
    }
}

링크:https://www.jianshu.com/p/33ed0d7cb413

좋은 웹페이지 즐겨찾기