时 间:2014-04-20 22:28:02
作 者:第7填 ID:668 城市:台州
摘 要:到今天才知道身份证最后一位是干什么的,希望和我一样还不知道的朋友一起学习下。
正 文:
到今天才知道身份证最后一位是干什么的,希望和我一样还不知道的朋友一起学习下,也许就我一个人不知道了,哎。在EXCEL里弄了个函数,正好这几天在做这方面的事情。源代码如下:
Function CstIdC(cstid As String) As String
'函数功能:1.输入15位老身份证号码返回18位新号码;2.输入18位身份证号码判断是否正确;3.输入17位身份证号码(不含最后一位)返回18位号码
'函数原理:1.根据前17位数字计算出校验码,与录入的最后一位校验码比对;2.判断年月日是否合理(出生日期应在1900年以后,当前日期之前的合法日期)。
'参数,CstId: 数字组合
'来源:第7天
Dim checkDate As String '存储身份证生日
CstIdC = "OK" '假设验证都是正确的,返回"OK"
'判断身份证长度是否正确
If Len(cstid) = 0 Then
CstIdC = ""
ElseIf Len(cstid) = 15 Then
CstIdC = Mid(cstid, 1, 6) & "19" & Mid(cstid, 7, 9) & mod11(Mid(cstid, 1, 6) & "19" & Mid(cstid, 7, 9))
CstIdC = CstIdC & checkBirthday(CstIdC)
ElseIf Len(cstid) = 17 Then
CstIdC = cstid & mod11(cstid) & checkBirthday(cstid & mod11(cstid))
ElseIf Len(cstid) = 18 Then
If mod11(Left(cstid, 17)) <> UCase(Right(cstid, 1)) Then
CstIdC = "校验错误"
Else
If checkBirthday(cstid) = "" Then
CstIdC = "OK"
Else
CstIdC = checkBirthday(cstid)
End If
End If
End If
End Function
Function mod11(cst17 As String) As String
Dim wI As Integer '存储计算得到的每位加权因数
Dim wSum As Long '存储身份证每位数字与对应加权因数乘积的和
Dim modI As Integer '存储wsum整除11的余数
'使用循环计算wSum值
Dim i As Integer
For i = 18 To 2 Step -1
If Not IsNumeric(Mid(cst17, 19 - i, 1)) Then
mod11 = "错误"
Exit Function
End If
wI = 2 ^ (i - 1) Mod 11 '计算加权因数
wSum = wSum + CLng(Mid(cst17, 19 - i, 1)) * wI '累加身份证数字与对应加权因数的乘积
Next
modI = wSum Mod 11 '计算wsum整除11的余数
'判读校验码
Select Case 12 - modI
Case Is < 10
mod11 = 12 - modI
Case Is = 10
mod11 = "X"
Case Is > 10
mod11 = 1 - modI
End Select
End Function
Function checkBirthday(cstid As String) As String
'判断出生日期是否合理
checkDate = Mid(cstid, 7, 4) & "-" & Mid(cstid, 11, 2) & "-" & Mid(cstid, 13, 2)
If IsDate(checkDate) Then '判断输入的身份证号码对应的生日组合是否为日期
If CDate(checkDate) < "1900-1-1" or CDate(checkDate) >= Date Then '判断生日是否在合理区间
checkBirthday = "年龄不合理"
Exit Function
End If
Else
checkBirthday = "生日错误"
Exit Function
End If
checkBirthday = ""
End Function
|
附 件:
点击下载此附件
Access软件网QQ交流群 (群号:54525238)
Access源码网店