iOS 신분증 판단 정규 가산 법
우리 나라 의 신분증 번 호 는 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.