iOS身份證號碼全校驗與校驗位自動補全
在專案中進行身份證號碼的校驗,首先有必要了解一下居民身份證的基本構成:
1、長度必須是18位,前17位必須是數字,第十八位可以是數字或X;
2、前兩位必須是以下情形中的一種: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;
3、第7到第14位出生年月日:第7到第10位為出生年份;11到12位表示月份,範圍為01-12;13到14位為合法的日期 ;
4、 第17位表示性別,雙數表示女,單數表示男;
5、 第18位為前17位的校驗位;演算法如下:總和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n1表示1位數字,其它類似;用總和除以11,看餘數是多少, 餘數只可能有0 1 2 3 4 5 6 7 8 9 10這11個數字。其分別對應的最後一位身份證的號碼為1 0 X 9 8 7 6 5 4 3 2;
6、出生年份的前兩位必須是19或20;身份證號驗證(粗略驗證) :如果只是驗證是否是18位純數字或17位純數字+x,這個方法完全可以適用。
+ (BOOL)validateIdentityCard:(NSString *)identityCard{
NSString *pattern = @"(^[0-9]{15})|([0−9]17([0−9]|X))";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:identityCard];
return isMatch;
}
- 身份證號全校驗
+ (BOOL)verifyIDCardNumber:(NSString *)value {
value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
int length =0;
if (!value) {
return NO;
} else {
length = value.length;
if (length !=15 && length !=18) {
return NO;
}
}
// 省份程式碼
NSArray *areasArray [email protected][@"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 false;
}
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[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[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)]]) {
return YES;// 檢測ID的校驗位
}else {
return NO;
}
}else {
return NO;
}
default:
return false;
}
}
相關推薦
iOS身份證號碼全校驗與校驗位自動補全
在專案中進行身份證號碼的校驗,首先有必要了解一下居民身份證的基本構成: 1、長度必須是18位,前17位必須是數字,第十八位可以是數字或X; 2、前兩位必須是以下情形中的一種:11、12、13、14、15、21、22、23、31、32、33、34、35、36
身份證號碼生成與校驗
style 山西 年份 組成 生成 rate rar div throws 在測試過程中難免會遇到需要身份證號碼的情況,記錄下隨機生成身份證號碼與如何檢驗身份證號碼的方法。 首先要了解身份證號碼的組成方式: 號碼結構:公民身份號碼是特征組合碼,由十七位數字本體碼
python3身份證號碼生成與校驗
# /usr/bin/python # -*- coding:utf-8 -*- import re import random from datetime import datetime, timedelta, date '''身份證第18位(校驗碼)的計算方法 1、將前面的身份證號碼17位數分別
身份證號碼校驗 java校驗
最近在身份證認證的時候,需要對身份證號碼進行校驗。這裡進行記錄下 package com.ptpl.web.util; /** * 身份證前6位【ABCDEF】為行政區劃數字程式碼(簡稱數字碼)說明(參考《GB/T 2260-2007 中華人民共和國行政區劃程式碼》)
js 手機號碼簡單正則校驗
test 分代 開頭 cti back 簡單 mage 循環 格式 現在手機號碼的號段有如下幾種,包括17年新發出的三個(166,199,198)號段。 在一些項目註冊登錄或者其他中,涉及到手機號進行一個簡單的有效驗證,在前端先進行一個簡單的檢驗; 判斷字符串是否
2018年最新電話號碼正則表示式校驗方法
正則表示式 ^1(3[0-9]|4[57]|5[^4]|6[6]|7[0-8]|8[0-9]|9[8-9])\\d{8}$ iOS使用方法 + (BOOL)checkPhoneNumber:(NSString *)phoneNumber{ /* ** 電訊號
angular4響應式表單與校驗
html檔案: <form [formGroup]="formModel" (submit)="onSubmit()"> <h2>響應式表單與校驗</h2> <div><label>使用者名稱:</label&
基於FPGA和串列埠的CRC碼生成與校驗
CRC又稱迴圈冗餘校驗,是資料通訊領域中最常用的一種查錯校驗碼。說是常用,但我在微控制器、FPGA的開發中從來沒有用過,別說是CRC了,就是串列埠的奇偶校驗都很少用。一個課程設計要做些和通訊相關的東西,題目裡面好像就只有這個CRC比較有意思,就研究起了這個。 乍一看起來這個東西好像挺高大上的
Sign簽名生成與校驗
引數說明: from 介面發起方標識,由管理員分配 secret 金鑰,由管理員分配 sign 簽名 timestamp 時間戳 s (用於校驗簽名有效期) sign演算法; 1.對所有引數
專案總結一:頁面彈出框+表單輸入與校驗形式,實現新增內容到頁面
最近參與的專案,總結其中的幾個功能點:今天先來簡單的,點選 新增 按鈕,頁面彈出彈框,彈框中通過表單輸入形式,使用者輸入內容,點選 確定 ,進行表單驗證,驗證通過後實現新增內容到頁面。所用框架與外掛:angular、layer 1、點選新增執行對應事件
React-native數獨遊戲(一)數獨生成與校驗
react-native還是蠻火的,前面用它做了一個火車票查詢的,感覺還可以,繼續研究,寫了這個數獨小遊戲,和大家分享一下。 github原始碼地址 第一部分是關於數獨生成的部分,數獨規則很簡單,行列都沒有重複,每個九宮格也不能重複,演算法也是依照此規則
隨機驗證碼的生成與校驗
工具類VerifyCodeUtil package com.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Gra
Python之——實現檔案打包、上傳與校驗
不多說,我們直接上原始碼: # -*- coding:UTF-8 -*- ''' 實現檔案打包、上傳與校驗 Created on 2018年1月12日 @author: liuyazhuang
JWT結合springboot來實現token的分發與校驗
因工作中需要用到登陸,此時就要用到token的分發與校驗,採用jwt來進行token的生成與校驗,下面把使用方法記下: 大致方案
SpringSecurity程式碼實現JWT介面許可權授予與校驗
通過筆者前兩篇文章的說明,相信大家已經知道JWT是什麼,怎麼用,該如何結合Spring Security使用。那麼本節就用程式碼來具體的實現一下JWT登入認證及鑑權的流程。 一、環境準備工作 建立Spring Boot專案並集成了Spring Security,專案可以正常啟動 通過controller寫一
案例17-validate自定義校驗規則校驗驗證碼是否輸入正確
scrip oge validate Coding function throw res form getwriter 1 自定義校驗規則代碼 <script type="text/javascript"> //使用validate插件進行表單的
理解UDP協議的首部校驗和校驗和
reference: https://blog.csdn.net/qiuchangyong/article/details/79945630
jquery validate 單個校驗+全部校驗
1、引入 <script src="/poobo/js/jquery/jquery-1.8.3.min.js" type="text/javascript"></script> <script type="text/javascrip
【直觀對比】奇偶校驗 累加和校驗 CRC校驗
奇偶校驗: 所謂通訊過程的校驗是指在通訊資料後加上一些附加資訊,通過這些附加資訊來判斷接收到的資料是否和傳送出的資料相同。比如說RS232 序列通訊可以設定奇偶校驗位,所謂奇偶校驗就是在傳送的每一個位元組後都加上一位,使得每個位元組中1的個數為奇數個或偶數個。比如我
Struts2 輸入校驗(Action中使用國際化資原始檔、校驗器校驗)
Action類獲得國際化資原始檔中的資訊,主要使用ActionSupport類的getText方法進行。 ActionSupport類過載了很多getText方法,常用的有如下幾個: 1、getText(String aTextName):引數aTextName是資原始檔中