一个18位身份证校验计算函数.docx

合集下载

身份证校验函数

身份证校验函数
--set @result=0
set @len=len(@str)
if(@len!=18 and @len!=15)--长度是18位或15位
begin
set @resulte when @len=18 then left(@str,17) else @str end like '%[^0-9]%' )--15位身份证要为数字,18位身份证前17位必须是数字
SQL版本身份证格式验证 0为错误,1为正确
CREATE function [dbo].[IsID](@str nvarchar(18),@sex int)--传入两个变量 身份证和性别(男1女2)
returns bit
as
begin
declare @len int
declare @result bit
convert(int,substring(@str,6,1))*4+
convert(int,substring(@str,7,1))*2+
convert(int,substring(@str,8,1))*1+
convert(int,substring(@str,9,1))*6+
begin
set @result=0
end
else
if(@len=18)--如果身份证是18位
begin--进行逻辑计算
declare @k int
declare @l nvarchar(11)
set @l='10X98765432'
set @k=
convert(int,left(@str,1))*7+

身份证号码校验实例

身份证号码校验实例

身份证号码校验实例
身份证号码是按照一定规律编制的,是个人身份的有效证明,每个人只有一个号码,且不会重复,因而被各单位各部门广泛应用在相关名册中。

在大量的身份证号码录入过程中,由于抄写或录入等原因,可能会弄错了某位数字,如果录错了任何一位数字,计算出来的校验码就不一样。

根据这一特点,本函数可以对已录入的大批量身份证号码进行校验,如果校验未通过,则说明你录入的号码中必定是某位数字错了,应及时更正,以保证身份证号码正确有效,如果录入的是第一代15位身份证号码,本函数将返回18位号码,使身份证号码保持统一的位数。

代码如下:
Function IDcheck(ID) '身份证号码校验函数
Dim s, iAs Integer
Dim e, z As String
Part1: '----------------------------身份证号码合法性检查---------------------------------------
If Not (Len(ID) = 18 Or Len(ID) = 15) Then '位数检验
IDcheck = "位数错误"
Exit Function
Else
If Len(ID) = 15 Then ID = Left(ID, 6) & "19" & Right(ID, 9)。

电子表格中关于身份证号的函数

电子表格中关于身份证号的函数

中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为:15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码。

18位:6位数字常住户口所在县市的行政区划代码,8位数字出生日期代码,3位数字顺序码和1位检验码。

其中3位数字顺序码,是为同一地址码的同年同月同日出生人员编制的顺序号,偶数的为女性,奇数的为男性。

1、提取籍贯地区的行政区划代码(A2为身份证号,下同)15与18位通用:=LEFT(A2,6)如果有一个编码和省份地区的对照表,可以用VLOOKUP函数来提取地区信息。

2、提取出生日期信息15位:=TEXT(19&MID(A2,7,6),"#-00-00")18位:=TEXT(MID(A2,7,8),"#-00-00")15与18位通用:=TEXT(IF(LEN(A2)=15,19,"")&MID(A2,7,6+IF(LEN(A2)=18,2,0))," #-00-00")简化公式:=TEXT((LEN(A1)=15)*19&MID(A1,7,6+(LEN(A1)=18)*2),"#-00-00") (请将输入公式的单元格格式设置为日期格式)3、提取性别信息15位:=IF(MOD(RIGHT(A2),2)=1,"男","女")18位:=IF(MOD(MID(A2),17,1)=1,"男","女")15与18位通用:=IF(MOD(MID(A2,IF(LEN(A2)=15,15,17),1),2)=1,"男","女") 简化公式:=IF(MOD(RIGHT(LEFT(A1,17)),2),"男","女")4、检验身份证号码的正确性18位身份证号码的最后一位是检验码,它是根据身份证前17位数字依照规则计算出来的,其值0~9或X。

WPS技巧

WPS技巧

WPS表格技巧:通过函数提取身份证信息(15位、18位通吃)<籍贯、性别、出生年月日、农历年、属相、生日、星座、出生至今年数、出生至今天数和判断证件有效性>通过身份证提取籍贯、农历年、属相、星座和出生至今天数是独家报道哦~等我研究透了,给你们计算生辰八字。

{:soso_e151:}[d1000]文件中公式说明:性别:1.=IFERROR(IF(LENB(A2)=15,IF(MOD(MID(A2,15,1),2)=1,"男","女"),IF(MOD(MID(A2,17,1),2)=1,"男","女")),"证件无效")运算说明:此运算中主要运用了循环余数(mod)函数,将a2单元格中从第15位数字起提取1位,并除以2,如果得到1,就是男性,否则就是女性。

<mod函数也是判断数字是否为奇偶数,或被某是否整除,此单元格中就运用了判断奇偶数,农历年和属相中运用了被60整除,在出生年月日:1.=IFERROR(IF(LENB(A2)=15,TEXT(MID(A2,7,6),"19"&"00年00月00日"),TEXT(MID(A2,7,8),"0年00月00日")),"证件无效")运算说明:此运算中运用了转换文本函数(text),指定提取(mid函数)的信息转化为指定的格式。

生日:1.=IFERROR(IF(LENB(A2)=15,TEXT(MID(A2,9,4),"00月00日"),TEXT(MID(A2,11,4),"00月00日")),"证件无效")运算说明:此运算与提取出生年月日类似,在这里只是提取(mid)月份和年份,然后用文本函数(text)强制转化为日期格式。

身份证号码校验算法实现

身份证号码校验算法实现

/*** 【身份证号码的规则】1、15位身份证号码组成:ddddddyymmddxxs共15位,其中:* dddddd为6位的地方代码,根据这6位可以获得该身份证号所在地。

yy为2位的年份代码,是身份证持有人的出身年份。

* mm为2位的月份代码,是身份证持有人的出身月份。

dd为2位的日期代码,是身份证持有人的出身日。

这6位在一起组成了身份证持有人的出生日期。

* xx为2位的顺序码,这个是随机数。

s为1位的性别代码,奇数代表男性,偶数代表女性。

2、18位身份证号码组成:* ddddddyyyymmddxxsp共18位,其中:其他部分都和15位的相同。

年份代码由原来的2位升级到4位。

最后一位为校验位。

校验规则是:* (1)十七位数字本体码加权求和公式S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和* Ai:表示第i位置上的身份证号码数字值Wi:表示第i位置上的加权因子Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2* (2)计算模Y = mod(S, 11) (3)通过模得到对应的校验码Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8* 7 6 5 4 3 2 也就是说,如果得到余数为1则最后的校验位p应该为对应的0.如果校验位不是,则该身份证号码不正确。

*/package citi;import java.util.Scanner;/*** @author D.puntu**/public class MyIdCard {private static String Id = null;private static String myIndexStr, index = null;private static int i = 0;private static int m = 0, n = 0, myIndex;private static int areaId, year, mon, day, sex;private static int id = 0;// 从第一位到第十七位的数字的权值private static int myArrayIndex[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9,10, 5, 8, 4, 2 };public static void main(String[] args) {startIndex();}private static void startIndex() {Scanner in = new Scanner(System.in);System.out.println("请输入身份证号(18位数字):");Id = in.next();i = Id.length();while (i != 18) {if (i > 18) {System.out.println("身份证号码只有18位数字,但是您输入" + i + "位,请重新输入");Id = in.next();i = Id.length();} else if (i < 18) {System.out.println("身份证号码应该有18位数字,但是您输入" + i + "位,请重新输入");Id = in.next();i = Id.length();}}if (i == 18) {while (!getAreaId(Id, i) || !getYear(Id, i) || !getMon(Id, i)|| !getDay(Id, i)) {Id = in.next();i = Id.length();}}getIndex(Id, i, getSum(Id, i));}private static int getSum(String id, int i) {for (m = 0; m < myArrayIndex.length; m++) {n = n + Integer.parseInt(id.substring(m, m + 1)) * myArrayIndex[m]; // 前17位加权后的和}myIndex = n % 11;// 取模return myIndex;}private static void getIndex(String id, int i, int m) {myIndexStr = id.substring(i - 1, i);// 取得校验位// 算出校验位switch (m) {case 0:index = "1";break;case 1:index = "0";break;case 2:index = "X";break;case 3:index = "9";break;case 4:index = "8";break;case 5:index = "7";break;case 6:index = "6";break;case 7:index = "5";break;case 8:index = "4";break;case 9:index = "3";break;case 10:index = "2";break;}if (index.equalsIgnoreCase(myIndexStr)) {System.out.println("输入的身份证号码有效!!");} else {System.out.println("输入的身份证号码无效!!");}}/*** 前六位范围110000----659001*/public static boolean getAreaId(String str, int i) {boolean myAreaId = false;areaId = Integer.parseInt(str.substring(id, id + 6));if (areaId > 659001 || areaId < 110000) {System.out.println("输入的身份证号码地址位有错误!!");myAreaId = false;} else {myAreaId = true;}return myAreaId;}public static boolean getYear(String str, int i) {boolean myYear = false;year = Integer.parseInt(str.substring(id + 6, id + 10));if (year > 2015 || year < 1865) {System.out.println("输入的身份证号码年份有错误!!请重新输入身份证号码");myYear = false;} else {myYear = true;}return myYear;}public static boolean getMon(String str, int i) {boolean myMon = false;mon = Integer.parseInt(str.substring(id + 10, id + 12));if (mon <= 12 && mon >= 1) {myMon = true;} else {System.out.println("输入的身份证号码月份有错误!!请重新输入身份证号码");}return myMon;}public static boolean getDay(String str, int i) {boolean myDay = false;int dayToMon = Integer.parseInt(str.substring(id + 10, id + 12));day = Integer.parseInt(str.substring(id + 12, id + 14));if (day >= 1 && day <= getMonday(dayToMon)) {myDay = true;} else {System.out.println("输入的身份证号码天数与对应的月份不一致!!请重新输入身份证号码");}return myDay;}public static int getMonday(int i) {int jDay = 0;switch (i) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:jDay = 31;case 4:case 6:case 9:case 11:jDay = 30;break;case 2:jDay = 28;}return jDay;}}。

身份证正确检验及验证公式

身份证正确检验及验证公式

验证公式一=IF(LEN(H20)=18,IF(RIGHT(H20,1)="X",IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18) )*7 LEFT(RIGHT(H20,17))*9 LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2LEFT(RIGHT(H20,11))*1 LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3LEFT(RIGHT(H20,8))*7 LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10LEFT(RIGHT(H20,5))*5 LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4LEFT(RIGHT(H20,2))*2),11)1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1)),"正确!","出错啦!"),IF(CHOOSE(MOD(SUM(LEFT(RIGHT(H20,18))*7 LEFT(RIGHT(H20,17))*9LEFT(RIGHT(H20,16))*10 LEFT(RIGHT(H20,15))*5 LEFT(RIGHT(H20,14))*8 LEFT(RIGHT(H20,13))*4 LEFT(RIGHT(H20,12))*2 LEFT(RIGHT(H20,11))*1LEFT(RIGHT(H20,10))*6 LEFT(RIGHT(H20,9))*3 LEFT(RIGHT(H20,8))*7LEFT(RIGHT(H20,7))*9 LEFT(RIGHT(H20,6))*10 LEFT(RIGHT(H20,5))*5LEFT(RIGHT(H20,4))*8 LEFT(RIGHT(H20,3))*4 LEFT(RIGHT(H20,2))*2),11)1,1,0,"X",9,8,7,6,5,4,3,2)=LEFT(RIGHT(H20,1))*1,"正确!","出错啦!")),IF(LEN(H20)=15,"老号,请注意!",IF(LEN(H20)=0,"缺号码","位数不对!")))验证公式二=MID("10X98765432",MOD(SUMPRODUCT(MID(H20,ROW(INDIRECT("1:17")),1)*2^(18 -ROW(INDIRECT("1:17")))),11) 1,1)=RIGHT(H20,1)身份证有15位和18位两种,身份证位数是否正确,我们可以用LEN函数判断。

身份号校验及数据比对公式说明

身份号校验及数据比对公式说明
1、Lookup_value为需要在数据表第一列中进行查找的数值。Lookup_value 可以为数值、引用或文本字符串。当vlookup函数第一参数省略查找值时,表示用0查找。
2、Table_array为需要在其中Байду номын сангаас找数据的数据表。使用对区域或区域名称的引用。
3、col_index_num为table_array 中查找数据的数据列序号。
4、Range_lookup为一逻辑值,指明函数 VLOOKUP 查找时是精确匹配,还是近似匹配。如果为FALSE或0 ,则返回精确匹配,如果找不到,则返回错误值 #N/A。
数据比对函数编写格式:
=VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
说明:vlookup函数的参数有Lookup_value、Table_array、col_index_num、Range_lookup,一共有4个。
身份证校验公式:(注意把D2修改成自己表中第一个身份证号所在的行列号)
=IF(LOOKUP(MOD(MID(D2,1,1)*7+MID(D2,2,1)*9+MID(D2,3,1)*10+MID(D2,4,1)*5+MID(D2,5,1)*8+MID(D2,6,1)*4+MID(D2,7,1)*2+MID(D2,8,1)*1+MID(D2,9,1)*6+MID(D2,10,1)*3+MID(D2,11,1)*7+MID(D2,12,1)*9+MID(D2,13,1)*10+MID(D2,14,1)*5+MID(D2,15,1)*8+MID(D2,16,1)*4+MID(D2,17,1)*2,11),{0;1;2;3;4;5;6;7;8;9;10},{"1";"0";"X";"9";"8";"7";"6";"5";"4";"3";"2"})=UPPER(MID(D2,18,1)),"正确","错误")

第二代居民身份证号码的校验码计算模型、步骤、公式

第二代居民身份证号码的校验码计算模型、步骤、公式

②将公式①的(2n ÷ 11取余) 普 去掉,只留2n 通 公 式 ③将公式①的LookUp函数 换成Mid函数
④将公式②的LookUp函数 换成Mid函数
⑤将公式①变为数组公式, =LEFT(D2,17)&LOOKUP(MOD(SUM(MID(D2,ROW(INDIRECT("1:17")),1)*MOD(2^(18ROW(INDIRECT("1:17"))),11)),11),{0;1;2;3;4;5;6;7;8;9;10},{1;0;"X";9;8;7;6;5;4;3;2}) 按Ctrl+Shift+Enter组合键 数 组 公 式 ⑥将公式②变为数组公式, =LEFT(D2,17)&LOOKUP(MOD(SUM(MID(D2,ROW(INDIRECT("1:17")),1)*2^(18ROW(INDIRECT("1:178;9;10},{1;0;"X";9;8;7;6;5;4;3;2}) 按Ctrl+Shift+Enter组合键 ⑦将公式③变为数组公式, =LEFT(D2,17)&MID("10X98765432",MOD(SUM(MID(D2,ROW(INDIRECT("1:17")),1)*MOD(2^(18ROW(INDIRECT("1:17"))),11)),11)+1,1) 按Ctrl+Shift+Enter组合键 ⑧将公式④变为数组公式, =LEFT(D2,17)&MID("10X98765432",MOD(SUM(MID(D2,ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1) 按Ctrl+Shift+Enter组合键

Excel校验身份证号码的自定义函数

Excel校验身份证号码的自定义函数

校验居民身份证号码函数 在日常工作中,我们经常用电子表格输入身份证号码,往往出现输入错误,校对麻烦。

由于身份证中第十八位数字的计算方法较为繁琐,下面提供了一个自定义函数,很方便。

=jysfz(身份证号码 字符型)示例:340524************←号码#NAME?=jysfz(A7)#NAME?=jysfz("340524************") 340524************#NAME? 340524************#NAME?340524************#NAME?340524************#NAME? 340524************#NAME? 340524************#NAME? 3405241952060122188#NAME?34052419710702233#NAME? 3405241964100622#NAME? 340524************#NAME? 34052419641006225想#NAME?#NAME?这样也有错!#NAME? 身份证的号码是按照国家的标准编制的,由18位组成:前六位为行政区划代码,第七至第十四位为出生日期码,第15至17位为顺序码,第15、16位为乡镇代码(一个乡镇可能有多个代码),第17位代表性别(奇数为男,偶数为女),第18位为校验码。

作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且我国的计算机应用系统也不承认19位的身份证号码。

Ⅹ是罗马数字的10,用Ⅹ来代替10,可以保证公民的身份证符合国家标准。

但是我国的居民身份证在升位后,一些人的尾号变成了X,这部分人在工作生活中,例如去银行存取钱、去汽车公司租赁汽车或者报名参加考试等等过程中,往往不被检验者理解,认为是假身份证,这样的误会给很多人的生活带来不便。

用于验证身份证号码的有效性,包括长度检查、字符检查和校验位检查的Excel函数公式

用于验证身份证号码的有效性,包括长度检查、字符检查和校验位检查的Excel函数公式

该函数用于验证身份证号码的有效性,包括长度检查、字符检查和校验位检查。

Function Peng(IDCard As String) As String' 定义变量Dim Weights As VariantDim CheckDigits As StringDim Sum As IntegerDim Remainder As IntegerDim CalculatedCheckDigit As StringDim i As Integer' 校验身份证号码的长度是否为18位If Len(IDCard) <> 18 ThenPeng = "错误:长度不正确" ' 返回错误信息Exit FunctionEnd If' 校验前17位是否全为数字For i = 1 To 17If Not IsNumeric(Mid(IDCard, i, 1)) ThenPeng = "错误:包含非数字字符" ' 如果有非数字字符,返回错误信息Exit FunctionEnd IfNext i' 校验最后一位字符是否为数字或字母XIf Not (Mid(IDCard, 18, 1) Like "[0-9X]") ThenPeng = "错误:最后一位字符无效" ' 返回错误信息Exit FunctionEnd If' 定义权重系数数组Weights = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1)' 计算前17位数字的加权和Sum = 0For i = 1 To 17Sum = Sum + CInt(Mid(IDCard, i, 1)) * Weights(i - 1) ' 将每位数字乘以对应的权重Next i' 计算校验码Remainder = Sum Mod 11 ' 计算加权和的模11CheckDigits = "10X98765432" ' 定义校验码对应的字符串CalculatedCheckDigit = Mid(CheckDigits, Remainder + 1, 1) ' 获取计算出的校验位' 校验最后一位字符If UCase(Mid(IDCard, 18, 1)) = CalculatedCheckDigit ThenPeng = "正确" ' 如果校验位正确,返回“正确”ElsePeng = "错误" ' 如果校验位不正确,返回“错误”End IfEnd Function使用方法1.打开Excel:启动Microsoft Excel并打开你要使用的工作簿。

身份证号第18位校验xls

身份证号第18位校验xls

校验方法:在蓝色格中输入身份证号,黄色格中即自动计算出校验码。

校验码的计算方法(摘自百度百科):
1、将前面的身份证号码17位数分别乘以不同的系数。

从第一位到第十七位的系数分别为:7-9-10-5
2、将这17位数字和系数相乘的结果相加。

3、用加出来和除以11,看余数是多少?
4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。

其分别对应的最后一位身份证的号码
5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现的是 X。

如果余数是10,身份证的最例如:某男性的身份证号码为【530102************】, 我们看看这个身份证是不是合法的身份证。

首先我们得出前17位的乘积和【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(也就是说其余数是2。

最后通过对应规则就可以知道余数2对应的检验码是X。

所以,可以判定这是一个正
系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。

如果余数是10,身份证的最后一位号码就是罗马数字 2。

证是不是合法的身份证。

*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是189,然后用189除以11得出的结果是所以,可以判定这是一个正确的身份证号码。

除以11得出的结果是189/11=17----2,。

公式计算.doc

公式计算.doc

电子表格计算公式1、查找重复内容公式:=IF(COUNTIF(A:A,A2)>1,"重复","")。

2、用出生年月来计算年龄公式:=TRUNC((DAYS360(H6,"2009/8/30",FALSE))/360,0)。

3、从输入的18位身份证号的出生年月计算公式:=CONCATENATE(MID(E2,7,4),"/",MID(E2,11,2),"/",MID(E2,13,2))。

4、从输入的身份证号码内让系统自动提取性别,可以输入以下公式:=IF(LEN(C2)=15,IF(MOD(MID(C2,15,1),2)=1,"男","女"),IF(MOD(MID(C2,17,1),2)=1,"男","女"))公式内的“C2”代表的是输入身份证号码的单元格。

1、求和: =SUM(K2:K56) ——对K2到K56这一区域进行求和;2、平均数: =AVERAGE(K2:K56) ——对K2 K56这一区域求平均数;3、排名: =RANK(K2,K$2:K$56) ——对55名学生的成绩进行排名;4、等级: =IF(K2>=85,"优",IF(K2>=74,"良",IF(K2>=60,"及格","不及格")))5、学期总评: =K2*0.3+M2*0.3+N2*0.4 ——假设K列、M列和N列分别存放着学生的“平时总评”、“期中”、“期末”三项成绩;6、最高分: =MAX(K2:K56) ——求K2到K56区域(55名学生)的最高分;7、最低分: =MIN(K2:K56) ——求K2到K56区域(55名学生)的最低分;8、分数段人数统计:(1) =COUNTIF(K2:K56,"100") ——求K2到K56区域100分的人数;假设把结果存放于K57单元格;(2) =COUNTIF(K2:K56,">=95")-K57 ——求K2到K56区域95~99.5分的人数;假设把结果存放于K58单元格;(3)=COUNTIF(K2:K56,">=90")-SUM(K57:K58) ——求K2到K56区域90~94.5分的人数;假设把结果存放于K59单元格;(4)=COUNTIF(K2:K56,">=85")-SUM(K57:K59) ——求K2到K56区域85~89.5分的人数;假设把结果存放于K60单元格;(5)=COUNTIF(K2:K56,">=70")-SUM(K57:K60) ——求K2到K56区域70~84.5分的人数;假设把结果存放于K61单元格;(6)=COUNTIF(K2:K56,">=60")-SUM(K57:K61) ——求K2到K56区域60~69.5分的人数;假设把结果存放于K62单元格;(7) =COUNTIF(K2:K56,"<60") ——求K2到K56区域60分以下的人数;假设把结果存放于K63单元格;说明:COUNTIF函数也可计算某一区域男、女生人数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

-个18位身份证校验计算函数
因需要对15位旧身份证号码进行升位和校验、查询处理,又没有搜索到现成的函数,于是自己写了一个简单的过程,希望能够帮得上需要的朋友。

本函数的功能单一,只能校验第18位号码是否正确或者取得第18位号码,其他功能留给人家自C扩展吧!
<%
' Version: 1. 0. 1
'Author: sfply(sfply@163. com)
'Last Modified: 2004/7/17 12:03
'Src是身份证号码,可以是15位也可以是18位,15位时只能返回验证码方式使用
'iChk参数取值真假,真代表校验Six是否18位身份证,并且校验第18位是否
正确号码而确定是否有效身份证,返冋只值为true或false
' 假代表返回止确的校验码,返回值为(l~x)
dim myldentify
myTdentify 二〃36050219781218133?〃
response .write chkldentiyCard(myldentify, false)
Function chkldentiyCard(Src,iChk)
dim myWi, myAi, mySrc(17), i, myCount myAi =,z 10X98765432'
myWi = split(z/7, 9, 10, 5, & 4, 2, 1, 6, 3, 7, 9, 10, 5, & 4, 2〃,〃,〃) if iChk then
if len (Src) = 18 then
for i = 0 to 16
mySrc(i)二mid(Src, i + 1, 1)
myCouni 二myCount + mySrc(i) * myWi(i)
next
if mid(myAi, (mycount mod 11)+1,1) = right (Src,1) then chkldcntiyCard = true '返回结果,TRUE为合法身份证验证码
el se
chkldentiyCard = false '返回结果,FALSE为非法身份证验证码
end if
else
chkldentiyCard = false '因为不是18位身份证所以返[H] FALSE
end if
el se
if len(Src)二15 or len(Src)二18 then
if len(Src) = 15 then Src = mid(Src, 1, 6) & "19〃 & mid(Src, 7, 9)
for i = 0 to 16
mySrc(i)二mid(Src, i + 1, 1)
myCount 二myCount + mySrc(i) * myWi (i)
n ext
chkldentiyCard = mid (myAi, (mycount mod 11)+1, 1)'返回正确的验证码else
chkldentiyCard二false '输入不不是15位或18位身份证号
end if
end if
Encl Function
%>
关于身份证第18是怎么计算的,原理如下
根据K屮华人民共和国国家标准GB 11643-19993屮有关公民身份号码的规定, 公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。

排列顺序从左至右依次为:六位数字地址码,八位数字出生H期码,三位数字顺序码和一位数字校验码。

地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。

生H期码表示编码对象出生的年、刀、FI,其屮年份用四位数字表示,年、月、HZ间不用分隔符。

顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。

顺序码的奇数分给男性,偶数分给女性。

校验码是根据前面十七位数字码,按照ISO 7064:1983. MOD 11-2校验码计算出来的检验码。

下面举例说明该计算方法。

15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19,但是这对于1900年出生的人不使用(这样的寿星不多了)
某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:
S (ai X Wi) (mod 11) (1)
公式⑴屮:
i——表示号码字符从由至左包括校验码在内的位置序号;
ai——表示第i位置上的号码字符值;
Wi——示第i位置上的加权因子,其数值依据公式肌二2 (n-1) (mod 11)计算得出。

18 17 16 15 14 13 12 11 10 9 8 7 6
ai 34052419800101 0 0 1 al
Wi 7 9 10 584216379 10 584
aiXWi 21 36 0 25 16 16 2 9 48 00905002a!
根据公式⑴进行计算:
L (aiXWi)二(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2)二189
189 一11 二17 + 2/11
Z (ai XWi)(mod 11) = 2
然后根据计算的结果,从下面的表屮查岀相应的校验码,其屮X表示计算结果为10:
工(aiXWI) (mod 11) 0123456789 10
校验码字符值ai 10X98765432
根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为340524************o
a[0]*7+a[l]*9+a[2]*10+a[3]*5+a[4]*8+a[5]*4+a[6]*2+a[7]*l+a,[8]*6+a[9
]*3
+a[10]*7+a[ll]*9+a[12]*10+a[13]*5+a[14]*8+a[15]*4+a[16]* 2。

相关文档
最新文档