ios严格检验身份证号码有效性
+ (BOOL)checkIDCard:(NSString *)sPaperId {
//判断位数
if (sPaperId.length != && sPaperId.length != ) {
return NO;
}
NSString *carid = sPaperId;
long lSumQT = ;
//加权因子
int R[] = {,,,,,,,,,,,,,,,,};
//校验码
unsigned char sChecker[] = {'','','X','','','','','','','',''};
//将15位身份证号转换为18位
NSMutableString *mString = [NSMutableString stringWithString:sPaperId];
if (sPaperId.length == ) {
[mString insertString:@ atIndex:];
long p =;
// const char *pid = [mString UTF8String];
for (int i =; i<; i++)
{
NSString * s = [mString substringWithRange:NSMakeRange(i, )];
p += [s intValue] * R[i];
// p += (long)(pid-48) * R;//
}
int o = p%;
NSString *string_content = [NSString stringWithFormat:@%c,sChecker[o]];
[mString insertString:string_content atIndex:[mString length]];
carid = mString;
}
//判断地区码
NSString *sProvince = [carid substringToIndex:];
NSLog(@sProvince = %@,sProvince);
if (![self isAreaCode:sProvince]) {
return NO ;
}
//判断年月日是否有效
//年份
int strYear = [[VUtils getStringWithRange:carid Value1: Value2:] intValue];
//月份
int strMonth = [[VUtils getStringWithRange:carid Value1: Value2:] intValue];
//日
int strDay = [[VUtils getStringWithRange:carid Value1: Value2:] intValue];
NSTimeZone *localZone = [NSTimeZone localTimeZone];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setTimeZone:localZone];
[dateFormatter setDateFormat:@yyyy-MM-dd HH:mm:ss];
NSDate *date = [dateFormatter dateFromString:[NSString stringWithFormat:@%d-%d-%d ::,strYear,strMonth,strDay]];
if (date == nil) {
return NO;
}
[carid uppercaseString];
const char *PaperId = [carid UTF8String];
//检验长度
if (!=strlen(PaperId)) {
return NO;
}
//校验数字
NSString * lst = [carid substringFromIndex:carid.length-];
char di = [carid characterAtIndex:carid.length-];
if (!isdigit(di)) {
if ([lst isEqualToString:@X]) {
}else{
return NO;
}
}
//验证最末的校验码
lSumQT = ;
for (int i = ; i<; i++){
NSString * s = [carid substringWithRange:NSMakeRange(i, )];
lSumQT += [s intValue] * R[i];
}
if (sChecker[lSumQT%] != PaperId[]) {
return NO;
}
return YES;
}
+ (NSArray *)provinceArr {
NSArray *pArr = @[
@,//北京市|110000,
@,//天津市|120000,
@,//河北省|130000,
@,//山西省|140000,
@,//内蒙古自治区|150000,
@,//辽宁省|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
@,//国外
];
return pArr;
}
+ (BOOL)isAreaCode:(NSString *)province {
//在provinceArr中找
NSArray * arr = [VUtils provinceArr];
int a = ;
for (NSString * pr in arr) {
if ([pr isEqualToString:province]) {
a ++;
}
}
if (a == ) {
return NO;
} else {
return YES;
}
}
+ (NSString *)getStringWithRange:(NSString *)str Value1:(int)v1 Value2:(int)v2 {
NSString * sub = [str substringWithRange:NSMakeRange(v1, v2)];
return sub;
}
ios严格检验身份证号码有效性的更多相关文章
- Python实现身份证号码有效性验证
# -*- coding: utf-8 -*- import re #Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!' ...
- JavaScript身份证号码有效性验证
最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个 ...
- php验证身份证号码有效性
<?php // 18位身份证校验码有效性检查 // idcard_checksum18('...'); function idcard_checksum18($idcard) { if (st ...
- IOS 根据身份证号码获取 年龄 生日 性别
/** 从身份证上获取年龄 18位身份证 */ -(NSString *)getIdentityCardAge:(NSString *)numberStr { NSDateFormatter *for ...
- iOS身份证号码识别
一.前言 身份证识别,又称OCR技术.OCR技术是光学字符识别的缩写,是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为可以使 ...
- php验证身份证号码正确性
发布:JB01 来源:脚本学堂 [大 中 小] 分享一例php代码,用于验证身份证号码的正确性,用到了preg_match.preg_replace函数,有需要的朋友可以参考学习下.本文转 ...
- 输入身份证号码自动读取生日与性别(delphi)
一.格式介绍: [15位号码格式] 1.第l一6位数为行政区划代码; 2.第7-12位数为出生日期代码; 3.第13---15位数为分配顺序代码; (1).行政区划代码,是指公民第一次申领居民身份证时 ...
- js身份证号码验证
验证身份证号码的有效性,包含15位和18位: 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列 ...
- 从身份证号码中获取性别、出生日期、籍贯,并更新mongodb
有这样的需求,人员信息是存在mongodb中,需要存放人员的身份证.性别.出生日期.籍贯等信息.通过脚本导入这些信息,但是只导入了身份证号码,其他信息空缺.现在需要补全其他信息. 其实身份证信息就包含 ...
随机推荐
- 通过spring,在项目的任意位置获取当前Request
需要引入: import javax.servlet.http.HttpServletRequest; import org.springframework.web.context.request.R ...
- python数字图像处理(13):基本形态学滤波
对图像进行形态学变换.变换对象一般为灰度图或二值图,功能函数放在morphology子模块内. 1.膨胀(dilation) 原理:一般对二值图像进行操作.找到像素值为1的点,将它的邻近像素点都设置成 ...
- Pjax.js防刷新技术
自我感觉良好,所以拿出现在自己用的 Pjax.js 分享给大家 当然 这个版本是 经过本人修改后的版本,跟其它 拿过来就用的 不一样 而且区别还不小 大多的 Pjax 都是 跟后台无关的,而这个版本是 ...
- Django1.8教程——从零开始搭建一个完整django博客(二)
在上一节中,我们已经创建了一个Django模型Post,并使Post模型与数据库同步.这一节中,我们将介绍Django管理站点,通过Django管理站点来管理我们创建的Post模型实例. 为你的模型创 ...
- 简单的音乐播放器(VS 2010 + Qt 4.8.5)
昨天历经千辛万苦,配置好了VS 2010中的Qt环境(包括Qt for VS插件),今天决定浅浅地品味一下将两者结合进行编程的魅力. 上网查了一些资料,学习了一些基础知识,决定做一个简单的音乐播放器, ...
- 【VR视频播放】解决Unity模型贴图反转的问题
使用UV贴图网模型上贴的时候, 会出现图片反过来的情况. 根本原因是因为, 一般系统的屏幕坐标系(例如Android)是左上角为原点(0,0), 但是Unity的贴图是以左下角为原点(0,0) 方法有 ...
- SequoiaDB 系列之五 :源码分析之main函数
好久好久没有写博客了,因为一直要做各种事,工作上的,生活上的,这一下就是半年. 时光如梭. 这两天回头看了看写的博客,感觉都是贻笑大方. 但是还是想坚持把SequoiaDB系列写完. 初步的打算已经确 ...
- 16.C#初见Lambda表达式及表达式树(九章9.1-9.3)
在说明Lambda相关知识前,我们需要了解Lambda表达式常用于LINQ,那么我们来聊下LINQ. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑: ...
- 50个提高PHP编程效率的方法
用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册 ...
- G-nav-04
'use strict';define([ 'jquery'], function($) { var nav = { init : function() { $("#burger-menu& ...