跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. 验证身份证格式的方法

验证身份证格式的方法

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
6 帖子 4 发布者 3.9k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • N 离线
    N 离线
    nmglyy
    写于 最后由 编辑
    #1

    def checkIdcard(self, cr, uid, ids, identification_id, context=None):
        Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!','身份证地区非法!']
        area={"11":"北京","12":"天津","13":"河北","14":"山西","15":"内蒙古","21":"辽宁","22":"吉林","23":"黑龙江","31":"上海","32":"江苏","33":"浙江","34":"安徽","35":"福建","36":"江西","37":"山东","41":"河南","42":"湖北","43":"湖南","44":"广东","45":"广西","46":"海南","50":"重庆","51":"四川","52":"贵州","53":"云南","54":"西藏","61":"陕西","62":"甘肃","63":"青海","64":"宁夏","65":"新疆","71":"台湾","81":"香港","82":"澳门","91":"国外"}
        identification_id=str(identification_id)
        identification_id=identification_id.strip()
        identification_id_list=list(identification_id)
        #地区校验
        if(not area[(identification_id)[0:2]]):
            raise osv.except_osv(_('提示!'), (''%s'.') %(Errors[4],))
        #15位身份号码检测
        if(len(identification_id)==15):
            if((int(identification_id[6:8])+1900) % 4 == 0 or((int(identification_id[6:8])+1900) % 100 == 0 and (int(identification_id[6:8])+1900) % 4 == 0 )):
                erg=re.compile('[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$')#//测试出生日期的合法性
            else:
                ereg=re.compile('[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$')#//测试出生日期的合法性
            if(re.match(ereg,identification_id)):
    raise osv.except_osv(
    ('提示!'), (''%s'.') %(Errors[0],))
               
            else:
                raise osv.except_osv(
    ('提示!'), (''%s'.') %(Errors[2],))
        #18位身份号码检测
        elif(len(identification_id)==18):
            #出生日期的合法性检查
            #闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
            #平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
            if(int(identification_id[6:10]) % 4 == 0 or (int(identification_id[6:10]) % 100 == 0 and int(identification_id[6:10])%4 == 0 )):
                ereg=re.compile('[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$')#//闰年出生日期的合法性正则表达式
            else:
                ereg=re.compile('[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$')#//平年出生日期的合法性正则表达式
            #//测试出生日期的合法性
            if(re.match(ereg,identification_id)):
                #//计算校验位
                S = (int(identification_id_list[0]) + int(identification_id_list[10])) * 7 + (int(identification_id_list[1]) + int(identification_id_list[11])) * 9 + (int(identification_id_list[2]) + int(identification_id_list[12])) * 10 + (int(identification_id_list[3]) + int(identification_id_list[13])) * 5 + (int(identification_id_list[4]) + int(identification_id_list[14])) * 8 + (int(identification_id_list[5]) + int(identification_id_list[15])) * 4 + (int(identification_id_list[6]) + int(identification_id_list[16])) * 2 + int(identification_id_list[7]) * 1 + int(identification_id_list[8]) * 6 + int(identification_id_list[9]) * 3
                Y = S % 11
                M = "F"
                JYM = "10X98765432"
                M = JYM[Y]#判断校验位
                if(M == identification_id_list[17]):#检测ID的校验位
                    raise osv.except_osv(
    ('提示!'), (''%s'.') %(Errors[0],))
                else:
                    raise osv.except_osv(
    ('提示!'), (''%s'.') %(Errors[3],))
            else:
                raise osv.except_osv(
    ('提示!'), (''%s'.') %(Errors[2],))
        else:
            raise osv.except_osv(
    ('提示!'), _(''%s'.') %(Errors[1],))

    1 条回复 最后回复
    0
    • mrshellyM 离线
      mrshellyM 离线
      mrshelly
      写于 最后由 编辑
      #2

      分享 @步科 大大分享的扩展..:

      [attachimg=1]

      1 条回复 最后回复
      0
      • wjfonhandW 离线
        wjfonhandW 离线
        wjfonhand
        写于 最后由 编辑
        #3

        buke威武,总监威武,已加标签。

        GoodERP -- Odoo China fork

        1 条回复 最后回复
        0
        • JoshuaJ 离线
          JoshuaJ 离线
          Joshua 管理员
          写于 最后由 编辑
          #4

          很好的分享,谢谢。

          【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

          1 条回复 最后回复
          0
          • mrshellyM 离线
            mrshellyM 离线
            mrshelly
            写于 最后由 编辑
            #5

            被贴了 就转图片为文字儿吧:
            <br / https://pypi.python.org/pypi/python-stdnum br />

            <br /><br />...<br />&gt;&gt;&gt; from stdnum.iso7064 import mod_11_2<br />&gt;&gt;&gt; mod_11_2.calc_check_digit(&#039;44022919890604423&#039;)<br />&#039;X&#039;<br />&gt;&gt;&gt; mod_11_2.validate(&#039;44022919890604423X&#039;)<br />&#039;44022919890604423X&#039;<br />&gt;&gt;&gt; mod_11_2.validate(&#039;440229198906044234&#039;)<br />Traceback (most recent call last):<br />&nbsp; File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;<br />&nbsp; File &quot;D:\Program Files\Python27\lib\site-packages\stdnum\iso7064\mod_11_2.py&quot;,<br /> line 65, in validate<br />&nbsp; &nbsp; raise InvalidChecksum()<br />stdnum.exceptions.InvalidChecksum: The number&#039;s checksum or check digit is inval<br />id.<br />&gt;&gt;&gt; mod_11_2.validate(&#039;440229198906044231&#039;)<br />Traceback (most recent call last):<br />&nbsp; File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;<br />&nbsp; File &quot;D:\Program Files\Python27\lib\site-packages\stdnum\iso7064\mod_11_2.py&quot;,<br /> line 65, in validate<br />&nbsp; &nbsp; raise InvalidChecksum()<br />stdnum.exceptions.InvalidChecksum: The number&#039;s checksum or check digit is inval<br />id.<br />&gt;&gt;&gt; mod_11_2.validate(&#039;440229198906044236&#039;)<br />Traceback (most recent call last):<br />&nbsp; File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;<br />&nbsp; File &quot;D:\Program Files\Python27\lib\site-packages\stdnum\iso7064\mod_11_2.py&quot;,<br /> line 65, in validate<br />&nbsp; &nbsp; raise InvalidChecksum()<br />stdnum.exceptions.InvalidChecksum: The number&#039;s checksum or check digit is inval<br />id.<br />&gt;&gt;&gt; mod_11_2.validate(&#039;44022919890605423X&#039;)<br />Traceback (most recent call last):<br />&nbsp; File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;<br />&nbsp; File &quot;D:\Program Files\Python27\lib\site-packages\stdnum\iso7064\mod_11_2.py&quot;,<br /> line 65, in validate<br />&nbsp; &nbsp; raise InvalidChecksum()<br />stdnum.exceptions.InvalidChecksum: The number&#039;s checksum or check digit is inval<br />id.<br />&gt;&gt;&gt;<br /><br />...<br />
            
            1 条回复 最后回复
            0

            • 登录

            • 没有帐号? 注册

            • 登录或注册以进行搜索。
            • 第一个帖子
              最后一个帖子
            0
            • 版块
            • 标签
            • 热门
            • 用户
            • 群组