标题:vfp数据库中的身份证号15位和18位如何转换
只看楼主
csijx
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-4-7
 问题点数:0 回复次数:8 
vfp数据库中的身份证号15位和18位如何转换
本人在编程过程中遇到需要对比身份证。对于已有的15位的身份证,即需要对比15位的,同时又要对比18位的,但是不知道15位如何转换为18位。反之对于18位身份证在对比18位的同时还要对比15位的身份证,请求帮助解决。
搜索更多相关主题的帖子: 身份证 vfp 数据库 
2008-04-08 18:04
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
得分:0 
论坛有15转18位身份证号的程序,楼主查阅一下。

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2008-04-08 21:51
csijx
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-4-7
得分:0 
回复 2# 的帖子
谢谢指点
2008-04-08 22:37
啸凡
Rank: 8Rank: 8
等 级:贵宾
威 望:45
帖 子:1356
专家分:885
注 册:2006-2-22
得分:0 
本人也编制了录入身份证号码时的检测纠错程序。但15位转18位时,第18位(校验码)在不知道新号码的情况下如何确定?

两人行已有我师……
2008-04-08 23:07
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
得分:0 
18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。
    GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实
施之日起代替GB11643-1989。
    GB11643-1999《公民身份号码》主要内容如下:
    一、范围
    该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
    二、编码对象
    公民身份号码的编码对象是具有中华人民共和国国籍的公民。
    三、号码的结构和表示形式
    1、号码的结构
    公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
    2、地址码
    表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
    3、出生日期码
    表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
    4、顺序码
    表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
    5、校验码
    (1)十七位数字本体码加权求和公式
    S = Ai * Wi, i = 2, ... , 18
    Y = mod(S, 11)
    i: 表示号码字符从右至左包括校验码字符在内的位置序号
    Ai:表示第i位置上的身份证号码字符值
    Wi:表示第i位置上的加权因子
    i: 18 17 16 15 14 13 12 11 10 9 8 7  6 5 4 3 2 1
    Wi: 7  9 10  5  8  4  2  1  6 3 7 9 10 5 8 4 2 1
    (2)校验码字符值的计算
    Y:      0 1 2 3 4 5 6 7 8 9 10
    校验码: 1 0 X 9 8 7 6 5 4 3  2

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2008-04-09 11:23
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
tiger5392版主的资料挺全的啊

活到老,学到老! http://www. E-mail:hu-jj@
2008-04-10 09:16
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
得分:0 
楼上,那些资料是网上的。

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2008-04-10 16:20
honeke
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-8-6
得分:0 
decl a(18),b(11) && 定义2个数组
* a[i]数组表示第不位加权因子
a(1)=7
a(2)=9
a(3)=10
a(4)=5
a(5)=8
a(6)=4
a(7)=2
a(8)=1
a(9)=6
a(10)=3
a(11)=7
a(12)=9
a(13)=10
a(14)=5
a(15)=8
a(16)=4
a(17)=2
*b[i]数组表示校验码字符值
b(1)='1'
b(2)='0'
b(3)='X'
b(4)='9'
b(5)='8'
b(6)='7'
b(7)='6'
b(8)='5'
b(9)='4'
b(10)='3'
b(11)='2'
*******升位计算开始***********
xhm=SUBSTR(ALLTRIM(thisform.text1.Value),1,6)+'19'+SUBSTR(ALLTRIM(thisform.text1.Value),7,9)
*↑* 上面是把15位身份证号码加上'19' ,表示19xx年。得到17位新号码.
s=0
y=0
FOR i=1 TO 17 &&用前17位数字计算出第18位身份证号码
wi=VAL(SUBSTR(ALLTRIM(xhm),i,1)) &&从17位号码里第取第i位号码并转换成数字型。
s=s+a(i)*wi  &&用第i位的加权因子 乘 第i位身份证号码,并求和。
next
y=MOD(s,11)  &&取计算出来的余数,根据这个数判断第18位号码是多少。
xhm=xhm+ALLTRIM(b(y+1)) &&组合18位身份证号码。
*↑* 上面的y必须加1,因为计算出来的余数是0.1.2.3.4.5.6.7.8.9.10的其中一个,
*↑* 而定义检验码数组的时候,是从a(1)开始的(好像不能从a(0)开始定义)
thisform.text2.Value=xhm

纯手工(原创),根据身份证升位规则 写出来与大家一起分享。
2011-08-06 17:53
zs_zs1974
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-1-16
得分:0 
sfzhm=ALLTRIM(thisform.text3.Value )  
IF !empty(sfzhm)
DIMENSION a(18),w(18)
*W(i)----表示第i位置上的加权因子
w(18)=7
w(17)=9
w(16)=10
w(15)=5
w(14)=8
w(13)=4
w(12)=2
w(11)=1
w(10)=6
w(9)=3
w(8)=7
w(7)=9
w(6)=10
w(5)=5
w(4)=8
w(3)=4
w(2)=2
w(1)=1
*!*    zs=.f.
  DO  case   
    CASE  len(allt(sfzhm))=18
        *a(18)表示号码字符从右至左包括校验码字符在内每个位置上的字符
        j=18
        FOR  i=1 to 18
            a(j)=subs(sfzhm,i,1)
            j=j-1
        ENDFOR
        *求号码的每个对应的字符与其对应的加权因子乘积之和并求其与11的余数
        s=0
        FOR  i=2 to 18
            s=s+VAL(ALLTRIM(a(i)))*W(i)
        ENDFOR
        y=mod(s,11)
        **校验其校验位是否正确
        DO  case
            CASE  y=0
                IF  val(allt(a(1)))<>1
                    =messagebox("身份证号码有误!",0x10,"提示信息")
                     thisform.text2.Value=0
                      =''
                     thisform.text3.Value =''
                ELSE
                    csnyr=date(val(subs(allt(sfzhm),7,4)),val(subs(allt(sfzhm),11,2)),val(subs(allt(sfzhm),13,2)))
                    IF  mod(val(subs(allt(sfzhm),15,3)),2)<>0
                        xb="男"
                    else
                        xb="女"
                    ENDIF
                     =xb
                    Thisform.text2.Value =Year(tmpaddresses.serverdate)-Year(csnyr)
*!*                        zs=.t.
                ENDIF
            CASE  y=1
                 IF  val(allt(a(1)))<>0
                    =messagebox("身份证号码有误!",0x10,"提示信息")
                     thisform.text2.Value=0
                      =''
                       thisform.text3.Value =''
                 ELSE
                    csnyr=date(val(subs(allt(sfzhm),7,4)),val(subs(allt(sfzhm),11,2)),val(subs(allt(sfzhm),13,2)))
                    IF  mod(val(subs(allt(sfzhm),15,3)),2)<>0
                        xb="男"
                    ELSE
                        xb="女"
                    ENDIF
                     =xb
                    Thisform.text2.Value =Year(tmpaddresses.serverdate)-Year(csnyr)
*!*                        zs=.t.
                ENDIF
            CASE  y=2
                IF  allt(a(1))<>"X"
                    =messagebox("身份证号码有误!",0x10,"提示信息")
                     thisform.text2.Value=0
                      =''
                     thisform.text3.Value =''
                ELSE
                    csnyr=date(val(subs(allt(sfzhm),7,4)),val(subs(allt(sfzhm),11,2)),val(subs(allt(sfzhm),13,2)))
                    IF mod(val(subs(allt(sfzhm),15,3)),2)<>0
                        xb="男"
                    ELSE
                        xb="女"
                    ENDIF
                     =xb
                    Thisform.text2.Value =Year(tmpaddresses.serverdate)-Year(csnyr)
*!*                        zs=.t.
                ENDIF
            CASE  y>=3
                 IF  val(allt(a(1)))+y<>12
                    =messagebox("身份证号码有误!",0x10,"提示信息")
                     thisform.text2.Value=0
                      =''
                     thisform.text3.Value =''  
                ELSE
                    csnyr=date(val(subs(allt(sfzhm),7,4)),val(subs(allt(sfzhm),11,2)),val(subs(allt(sfzhm),13,2)))
                    IF  mod(val(subs(allt(sfzhm),15,3)),2)<>0
                        xb="男"
                    ELSE
                        xb="女"
                    ENDIF
                     =xb
                    Thisform.text2.Value =Year(tmpaddresses.serverdate)-Year(csnyr)
*!*                        zs=.t.
                ENDIF
            ENDCASE
    **将15位身份证号码转换为18位
    CASE  len(allt(sfzhm))=15
        **将15位身份证号出生年前加上"19"
        sfzhm=subs(allt(sfzhm),1,6)+"19"+subs(allt(sfzhm),7,9)
        **将带有19的17位号码赋值给数组
        j=18
        FOR  i=1 to 17
            a(j)=subs(sfzhm,i,1)
            j=j-1
        ENDFOR
        *号码的每个对应的字符与其对应的加权因子乘积之和并求其与11的余数
        s=0
        FOR  i=2 to 18
            s=s+val(allt(a(i)))*W(I)
        ENDFOR
        y=mod(s,11)
        **求校验号
        DO  case
            CASE  y=0
                a(1)="1"
            CASE  y=1
                a(1)="0"
            CASE  y=2
                a(1)="X"
            CASE  y>=3
                a(1)=allt(str(12-y))
        ENDCASE
        **将15位转换为18位的号码
        sfzhm=sfzhm+a(1)
        csnyr=date(val(subs(allt(sfzhm),7,4)),val(subs(allt(sfzhm),11,2)),val(subs(allt(sfzhm),13,2)))
        IF  mod(val(subs(allt(sfzhm),15,3)),2)<>0
            xb="男"
        ELSE
            xb="女"
        ENDIF
         =xb
        Thisform.text2.Value =Year(tmpaddresses.serverdate)-Year(csnyr)
*!*            zs=.t.
    **如果输入的位数少于15位
    CASE  len(allt(sfzhm))<15
        =messagebox("您输入的身份证号码位数不正确!",0x10,"提示信息")
         thisform.text3.Value =''
         thisform.text2.Value=0
          =''
    ENDCASE
    thisform.refresh
ENDIF
2015-01-28 16:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-207838-1-1.html




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

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