前言
在开发中,基本都需要到注册,而注册通常要输入一些身份信息,当然前端也是需要验证是否是合法的身份证才能提交。这篇文章只是放出个人的代码,不代表全正确!!!
扩展NSString代码
扩展NSString,添加以下方法:
- (BOOL)hyb_isValidPersonID { return [NSStringhyb_isValidPersonID:self]; } + (BOOL)hyb_isValidPersonID:(NSString *)personId { // 判断位数 if (personId.length != 15 && personId.length != 18) { return NO; } NSString *carid = personId; long lSumQT = 0; // 加权因子 int R[] ={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; // 校验码 unsigned char checkers[11]={'1','0','X', '9', '8', '7', '6', '5', '4', '3', '2'}; // 将15位身份证号转换成18位 NSMutableString *str = [NSMutableStringstringWithString:personId]; if (personId.length == 15) { [strinsertString:@"19"atIndex:6]; long p = 0; const char *personId = [strUTF8String]; for (int i = 0; i<= 16; i++) { p += (personId[i] - 48) * R[i]; } int o = p % 11; NSString *string_content = [NSStringstringWithFormat:@"%c", checkers[o]]; [strinsertString:string_contentatIndex:[strlength]]; carid = str; } // 判断地区码 NSString * sProvince = [caridsubstringToIndex:2]; if (![self_areaCode:sProvince]) { return NO; } // 判断年月日是否有效 // 年份 int strYear = [[self_substringWithString:caridbegin:6end:4]intValue]; // 月份 int strMonth = [[self_substringWithString:caridbegin:10end:2]intValue]; // 日 int strDay = [[self_substringWithString:caridbegin:12end:2]intValue]; NSTimeZone *localZone = [NSTimeZone localTimeZone]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; [dateFormattersetDateStyle:NSDateFormatterMediumStyle]; [dateFormattersetTimeStyle:NSDateFormatterNoStyle]; [dateFormattersetTimeZone:localZone]; [dateFormattersetDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate *date=[dateFormatterdateFrostr:[NSStringstringWithFormat:@"%d-%d-%d 12:01:01", strYear, strMonth, strDay]]; if (date == nil) { return NO; } const char *pid = [caridUTF8String]; // 检验长度 if(18 != strlen(pid)) return NO; // 校验数字 for (int i = 0; i < 18; i++) { if ( !isdigit(pid[i]) && !(('X' == pid[i] || 'x' == pid[i]) && 17 == i) ) { return NO; } } // 验证最末的校验码 for (int i = 0; i <= 16; i++) { lSumQT += (pid[i]-48) * R[i]; } if (checkers[lSumQT%11] != pid[17] ) { return NO; } return YES; } #pragma mark - Private + (NSString *)_substringWithString:(NSString *)strbegin:(NSInteger)beginend:(NSInteger )end { return [strsubstringWithRange:NSMakeRange(begin, end)]; }
关注我
Swift/ObjC技术群一: 324400294(已满)
Swift/ObjC技术群二: 494669518
ObjC/Swift高级群: 461252383(注明年限,新手勿扰)
关注微信公众号: iOSDevShares
关注新浪微博账号:标哥Jacky
标哥的GITHUB地址: CoderJackyHuang
支持并捐助
如果您觉得文章对您很有帮忙,希望得到您的支持。您的捐肋将会给予我最大的鼓励,感谢您的支持!
支付宝捐助 | 微信捐助 |
---|---|
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/3326.html