Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-模块/函数/VBA

身份证自检验和15位升18位问题

时 间: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源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助