前言

最近在一个二次开发的项目中看到了一段身份证验证的OC代码,虽然我一直讨厌二次开发。因为这这个二次开发的项目太老,代码太乱,毫无层次感。可是令人欣慰的是,我在里面发现了一段有用的代码,感兴趣的可以参考学习。
直接上代码
- (BOOL)isValidIdCardNum
{
NSString *value = [self copy];
value = [value stringByReplacingOccurrencesOfString:@"X" withString:@"x"];
value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
int length = 0;
if (!value) {
return NO;
}else {
length = (int)value.length;
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;
switch (length) {
case 15:
year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900;
if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) {
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];// 测试出生日期的合法性
}
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-9][0-9]{5}19|20[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}[0-9Xx]$"options:NSRegularExpressionCaseInsensitive error:nil];// 测试出生日期的合法性
}else {
regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19|20[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}[0-9Xx]$"
options:NSRegularExpressionCaseInsensitive error:nil];// 测试出生日期的合法性
}
numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, value.length)];
if(numberofMatch > 0) {
int S = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([value substringWithRange:NSMakeRange(6,1)].intValue + [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;
int Y = S % 11;
NSString *M = @"F";
NSString *JYM = @"10X98765432";
M = [JYM substringWithRange:NSMakeRange(Y,1)]; // 判断校验位
if ([M isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]]) {
return YES;// 检测ID的校验位
}else {
return NO;
}
}else {
return NO;
}
default:
return NO;
}
return NO;
}
上面的代码验证十分全面。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# c
# 身份证验证
# objective
# 教程
# iOS 中使用正则表达式判断身份证格式及银行卡号格式是否正确(推荐)
# IOS开发之由身份证号码提取性别的实现代码
# iOS身份证号码识别示例
# IOS 身份证校验详细介绍及示例代码
# iOS正则表达式验证手机号、邮箱、身份证号等
# IOS身份证识别(OCR源码)详解及实例代码
# iOS判断身份证号码是否正确的方法
# iOS Touch ID 身份认证
# 出生日期
# 的是
# 我在
# 感兴趣
# 我一直
# 校验位
# 这篇文章
# 谢谢大家
# 太乱
# 发现了
# 这这
# 有疑问
# areasArray
# NSArray
# brush
# class
# pre
# isValidIdCardNum
# BOOL
# cpp
相关文章:
如何在Golang中指定模块版本_使用go.mod控制版本号
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
如何通过万网虚拟主机快速搭建网站?
建站之星logo尺寸如何设置最合适?
Thinkphp 中 distinct 的用法解析
如何快速搭建高效香港服务器网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
北京制作网站的公司,北京铁路集团官方网站?
淘宝制作网站有哪些,淘宝网官网主页?
linux top下的 minerd 木马清除方法
如何在Windows服务器上快速搭建网站?
建站之星上传入口如何快速找到?
如何快速查询网址的建站时间与历史轨迹?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
如何快速搭建自助建站会员专属系统?
建站之星×万网:智能建站系统+自助建站平台一键生成
如何通过虚拟主机快速搭建个人网站?
如何在香港服务器上快速搭建免备案网站?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
建站之星如何防范黑客攻击与数据泄露?
如何用景安虚拟主机手机版绑定域名建站?
宝塔建站无法访问?如何排查配置与端口问题?
家庭服务器如何搭建个人网站?
如何快速生成ASP一键建站模板并优化安全性?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何快速搭建FTP站点实现文件共享?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
建站之星代理费用多少?最新价格详情介绍
建站之星安装步骤有哪些常见问题?
建站之星如何开启自定义404页面避免用户流失?
如何快速生成可下载的建站源码工具?
如何在VPS电脑上快速搭建网站?
免费网站制作appp,免费制作app哪个平台好?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
如何选择高效稳定的ISP建站解决方案?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
,巨量百应是干嘛的?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
如何在企业微信快速生成手机电脑官网?
,制作一个手机app网站要多少钱?
建站之星安装后界面空白如何解决?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何将凡科建站内容保存为本地文件?
济南网站制作的价格,历城一职专官方网站?
表情包在线制作网站免费,表情包怎么弄?
如何通过cPanel快速搭建网站?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
如何快速搭建安全的FTP站点?
Swift中循环语句中的转移语句 break 和 continue
小建面朝正北,A点实际方位是否存在偏差?
*请认真填写需求信息,我们会在24小时内与您取得联系。