1. 程式人生 > >iOS身份證號碼全校驗與校驗位自動補全

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是資原始檔中