| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1579 人关注过本帖
标题:请老师给分析一个关于身份证号检测程序
只看楼主 加入收藏
shyibaoban
Rank: 1
等 级:新手上路
帖 子:125
专家分:2
注 册:2008-12-3
结帖率:77.78%
收藏
已结贴  问题点数:20 回复次数:8 
请老师给分析一个关于身份证号检测程序
Function MyIdentityCardVerify &&校验身份证号是否合法
    Lparameters lstr &&参数:lstr 传入的号码
    Private lstr,relyn,tsfz,m1,m2,m3,m4,m,I,r,c,ai,wi
    relyn=.F. &&返回值
    tsfz=Alltrim(lstr)
    *分别用m1,m2,m3,m4表示四个条件是否成立
    Stor .T. To m1,m2,m3,m4
    *条件1:只能是15或18位
    m1=Iif(Len(tsfz)=15 Or Len(tsfz)=18,.T.,.F.)
    If Len(tsfz)=15 && 15位的号码
        For I=1 To 15 &&检查每一位是否为数字
            m=Asc(Substr(tsfz,I,1))
            If m<48 Or m>57 &&数字
                m2=.F. &&若有一位不是就不再查
                Exit
            Endif
        Endfor
       m="19" +Substr(tsfz, 7,2) &&早期的号都是上个世纪的
        m=m+"."+Substr(tsfz, 9,2)
        m=m+"."+Substr(tsfz,11,2)
        m=Ctod(m)
        If Isnull(m) Or Isblank(m)
            m3=.F. &&生日不正确
        Endif
    Endif
    If Len(tsfz)=18 && 18位的号码
        For I=1 To 17
            m=Asc(Substr(tsfz,I,1))
            If m<48 Or m>57
                m2=.F.
                Exit
            Endif
        Endfor
        m=Substr(tsfz,7,4)
        m=m+"."+Substr(tsfz,11,2)
        m=m+"."+Substr(tsfz,13,2)
        m=Ctod(m)
        If Isnull(m) Or Isblank(m)
            m3=.F.
        Endif
        r=0 &&计算校验位
        For I=18 To 2 Step -1
            ai=Val(Substr(tsfz,19-i,1))
            wi=Mod(2^(i-1),11)
            r=r+ai*wi
        Next
        r=Mod(r,11)
        Do Case
            Case r=0
                c="1"
            Case r=1
                c="0"
            Case r=2
                c="X"
            Otherwise
                c=Alltrim(Str(12-r))
        Endcase
        If Upper(Substr(tsfz,18,1))<>c
            m4=.F. &&校验位与原码最末位不同
        Endif
    Endif
    *四个条件全成立,则返回.t.
    relyn=Iif(m1 And m2 And m3 And m4,.T.,.F.)
    Return relyn
Endfunc
其中红色部分检测身份证时不能通过,不知为什么,请老师指点!

[ 本帖最后由 shyibaoban 于 2010-10-19 23:50 编辑 ]
搜索更多相关主题的帖子: 检测 老师 身份证 
2010-10-19 23:25
shyibaoban
Rank: 1
等 级:新手上路
帖 子:125
专家分:2
注 册:2008-12-3
收藏
得分:0 
没人看到,还是不屑一顾啊,帮个忙了。
2010-10-20 01:19
nhygm888
Rank: 2
等 级:论坛游民
威 望:1
帖 子:186
专家分:42
注 册:2008-7-20
收藏
得分:5 
m="19" +Substr(tsfz, 7,2) &&早期的号都是上个世纪的
        m=m+"."+Substr(tsfz, 9,2)
        m=m+"."+Substr(tsfz,11,2)
        m=Ctod(m)
        If Isnull(m) Or Isblank(m)
            m3=.F. &&生日不正确
        Endif

注意你系统中的 日期格式!!是年月日的格式吗?不是在系统中设置一下 就好了....

[ 本帖最后由 nhygm888 于 2010-10-20 07:13 编辑 ]
2010-10-20 07:11
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:5 
不光是年月日格式,还有分隔符的问题,常用的分隔符有:/、-,用点号的可能很少。
最好改用date()函数来组成日期,这样就避免了格式和分隔符的问题。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2010-10-20 07:40
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:5 
  简单试了一下,没发现错误信息。

[ 本帖最后由 qjbzjp 于 2010-10-20 11:51 编辑 ]

相互学习,互相交流,共同提高。
2010-10-20 11:37
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:0 
楼主是不是调用的方法有问题啊,试了几个没问题:
MyIdentityCardVerify("142601195703251012")
MyIdentityCardVerify("142601570325102")
MyIdentityCardVerify("14260119570325d1012")

相互学习,互相交流,共同提高。
2010-10-20 11:41
shyibaoban
Rank: 1
等 级:新手上路
帖 子:125
专家分:2
注 册:2008-12-3
收藏
得分:0 
以上老师说的对,我看了一下,真的是在VF里的时间有问题,改过后在命令窗口中测试可以了,但到程序里一调用就不成了,不知道怎样调用?请教。

[ 本帖最后由 shyibaoban 于 2011-12-14 13:58 编辑 ]
2010-10-21 22:39
nhygm888
Rank: 2
等 级:论坛游民
威 望:1
帖 子:186
专家分:42
注 册:2008-7-20
收藏
得分:0 
在你的程序中 用 SET DATE  设置日期格式  日期分隔符 按4楼说的 就应该没有问题!!~~
SET DATE 的作用域是当前数据工作期。
我一般不在 导入的时候做判断, 有不符合规定的就退出, 那你不得一个一个去改吗??
把数据都导进去在表中做判断不好吗? 要不判断出错的记录就跳过去,用一个文本记录下来..

[ 本帖最后由 nhygm888 于 2010-10-21 22:57 编辑 ]
2010-10-21 22:47
寻H不得
Rank: 4
等 级:业余侠客
威 望:1
帖 子:181
专家分:222
注 册:2010-10-9
收藏
得分:5 
这时间没多长 就回了这么多 人气旺啊 比DELPHI强多了
看过你的程序 你好像没有考虑行政区划码的问题哟!!
2010-10-21 23:40
快速回复:请老师给分析一个关于身份证号检测程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018095 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved