魔方网表 让信息化更简单

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

查看: 6215|回复: 4

[原创] 有关身份证号码处理的一个实例介绍(附模板)

[复制链接]
pobopo 发表于 2010-8-11 18:02:52 | 显示全部楼层 |阅读模式
本帖最后由 pobopo 于 2011-2-26 23:40 编辑

有关身份证号码处理的一个实例介绍:

在此实例中,手工输入性别、身份证号码,若身份证号码长度为15位,则计算生成18位号码后存入另一字段,同时校验:所输入的号码的长度是否为15位或18位,其中月日范围、性别码(是否与手工输入的性别一致)、所输入的18位号码的校验码。

1. 该实例涉及表单内字段:

输入身份证号码(文本型,最大长度:18),
校验身份证号码(文本型,最大长度:18),
性别(下拉列表型:男、女。默认值:男)。“性别”字段的值是手工输入。

2. 计算公式

   编辑计算公式的字段:校验身份证号码

   有关身份证的计算方法,参考了该网址:http://hometown.scau.edu.cn/bBS/viewthread.php?tid=78199

   关于计算公式的说明:
   只能针对1900-1999年期间的出生日期,作补足计算。
   若字段“输入身份证号码”为空时,则赋空值到本字段(”校验身份证号码“);
   否则,若字段“输入身份证号码”输入长度为18位时,则直接赋值到本字段;
   否则,视为长度为15位身份证号码处理,先补足为17位后计算身份证校验码,再补足为18位身份证号码赋值到本字段。
---------
请注意计算公式中的round()函数。如果不用,则因其计算结果有小数而得不出想要的正确结果。
---------
   编辑计算公式:
if(MFISNULL($MF(输入身份证号码)$),"",if(len($MF(输入身份证号码)$)=18,$MF(输入身份证号码)$,MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15)&if(round(mod((12-MOD((VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),1,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),2,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),3,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),4,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),5,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),6,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),7,1))*2+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),8,1))*1+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),9,1))*6+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),10,1))*3+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),11,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),12,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),13,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),14,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),15,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),16,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),17,1))*2),11)),11),0)=10,"X",mid(round(mod(12-MOD((VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),1,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),2,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),3,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),4,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),5,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),6,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),7,1))*2+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),8,1))*1+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),9,1))*6+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),10,1))*3+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),11,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),12,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),13,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),14,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),15,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),16,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),17,1))*2),11),11),0),1,1))))

3. 编写校验用的回写公式如下:

(1)公式名称:校验输入身份证号码0
     公式描述:“输入身份证号码”的长度校验。
     触发类型:修改记录(新增记录的校验用回写公式与此相同)
     执行时机:操作前
     编辑执行条件公式:

if(MFISNULL($MF(输入身份证号码)$),true,or(len($MF(输入身份证号码)$)=15,len($MF(输入身份证号码)$)=18))

     是否提交后重新计算:勾选√
     不满足条件则终止:勾选√
     编辑提示信息:"所输入的号码长度有误!"&MFNEWLINE()&"应为15位或18位。"


(2)公式名称:校验输入身份证号码1
     公式描述:“输入身份证号码”的月日的范围校验。
     触发类型:修改记录(新增记录的校验用回写公式与此相同)
     执行时机:操作前
     编辑执行条件公式:
         关于公式的说明:
         若字段“输入身份证号码”为空时,则设条件值为true,即校验通过,允许继续执行;
         否则,若字段“输入身份证号码”输入长度为18位时,提取出月份字符并转换为数值检查其是否在1至12之间,提取出日(天)字符并转换为数值检查其是否在1至31之间;
         否则,视为长度为15位身份证号码处理,校验月日范围。

if(MFISNULL($MF(输入身份证号码)$),true,if(len($MF(输入身份证号码)$)=18,and(and(value(mid($MF(输入身份证号码)$,11,2))>=1,value(mid($MF(输入身份证号码)$,11,2))<=12),and(value(mid($MF(输入身份证号码)$,13,2))>=1,value(mid($MF(输入身份证号码)$,13,2))<=31)),and(and(value(mid($MF(输入身份证号码)$,9,2))>=1,value(mid($MF(输入身份证号码)$,9,2))<=12),and(value(mid($MF(输入身份证号码)$,11,2))>=1,value(mid($MF(输入身份证号码)$,11,2))<=31))))

     是否提交后重新计算:勾选√
     不满足条件则终止:勾选√
     编辑提示信息:
"月份或日期不对!请分别检查!"&MFNEWLINE()&"18位身份证号码的第11位或第13位起的2个数字,分别对应月、日。"&MFNEWLINE()&"15位身份证号码的第9位或第11位起的2个数字,分别对应月、日。"


(3)公式名称:校验输入身份证号码2
     公式描述:与“性别”字段值的比较校验
     触发类型:修改记录(新增记录的校验用回写公式与此相同)
     执行时机:操作前
     编辑执行条件公式:
  
and(if(MFISNULL($MF(输入身份证号码)$),true,or(and(if(len($MF(输入身份证号码)$)=15,mod(value(right($MF(输入身份证号码)$,1)),2)=0,mod(value(left(right($MF(输入身份证号码)$,2),1)),2)=0),$MF(性别)$="女"),and(if(len($MF(输入身份证号码)$)=15,mod(value(right($MF(输入身份证号码)$,1)),2)<>0,mod(value(left(right($MF(输入身份证号码)$,2),1)),2)<>0),$MF(性别)$="男"))))

     编辑提示信息:
"与‘性别’字段值不符!请检查输入的身份证号码。"&MFNEWLINE()&"15位号码的倒数第一位数字、18位号码的倒数第二位数字:男应为单数,女应为双数。"

(4)公式名称:校验18位身份证号码的校验码3
     公式描述:
     触发类型:修改记录(新增记录的校验用回写公式与此相同)
     执行时机:操作前
     编辑执行条件公式:

if(MFISNULL($MF(输入身份证号码)$),true,if(len($MF(输入身份证号码)$)=18,right($MF(输入身份证号码)$,1)=if(round(mod((12-MOD((VALUE(MID($MF(输入身份证号码)$,1,1))*7+VALUE(MID($MF(输入身份证号码)$,2,1))*9+VALUE(MID($MF(输入身份证号码)$,3,1))*10+VALUE(MID($MF(输入身份证号码)$,4,1))*5+VALUE(MID($MF(输入身份证号码)$,5,1))*8+VALUE(MID($MF(输入身份证号码)$,6,1))*4+VALUE(MID($MF(输入身份证号码)$,7,1))*2+VALUE(MID($MF(输入身份证号码)$,8,1))*1+VALUE(MID($MF(输入身份证号码)$,9,1))*6+VALUE(MID($MF(输入身份证号码)$,10,1))*3+VALUE(MID($MF(输入身份证号码)$,11,1))*7+VALUE(MID($MF(输入身份证号码)$,12,1))*9+VALUE(MID($MF(输入身份证号码)$,13,1))*10+VALUE(MID($MF(输入身份证号码)$,14,1))*5+VALUE(MID($MF(输入身份证号码)$,15,1))*8+VALUE(MID($MF(输入身份证号码)$,16,1))*4+VALUE(MID($MF(输入身份证号码)$,17,1))*2),11)),11),0)=10,"X",mid(round(mod(12-MOD((VALUE(MID($MF(输入身份证号码)$,1,1))*7+VALUE(MID($MF(输入身份证号码)$,2,1))*9+VALUE(MID($MF(输入身份证号码)$,3,1))*10+VALUE(MID($MF(输入身份证号码)$,4,1))*5+VALUE(MID($MF(输入身份证号码)$,5,1))*8+VALUE(MID($MF(输入身份证号码)$,6,1))*4+VALUE(MID($MF(输入身份证号码)$,7,1))*2+VALUE(MID($MF(输入身份证号码)$,8,1))*1+VALUE(MID($MF(输入身份证号码)$,9,1))*6+VALUE(MID($MF(输入身份证号码)$,10,1))*3+VALUE(MID($MF(输入身份证号码)$,11,1))*7+VALUE(MID($MF(输入身份证号码)$,12,1))*9+VALUE(MID($MF(输入身份证号码)$,13,1))*10+VALUE(MID($MF(输入身份证号码)$,14,1))*5+VALUE(MID($MF(输入身份证号码)$,15,1))*8+VALUE(MID($MF(输入身份证号码)$,16,1))*4+VALUE(MID($MF(输入身份证号码)$,17,1))*2),11),11),0),1,1)),true))

      编辑提示信息:
"18位身份证号码的末位校验码不正确!"&MFNEWLINE()&"可以改为输入旧的15位号码,点击‘重算公式’按钮生成18位的身份证号码。"
---------------

生成18位身份证号码.mft

22.75 KB, 下载次数: 34

售价: 1 魔方币  [记录]

yangjiacheng520 发表于 2010-8-14 16:35:08 | 显示全部楼层
的方式的斯蒂芬斯蒂芬
回复

使用道具 举报

 楼主| pobopo 发表于 2011-2-26 23:02:28 | 显示全部楼层
本帖最后由 pobopo 于 2011-2-26 23:43 编辑

3# riancel
谢谢您!
====
---------
请注意计算公式中的round()函数。如果不用,则因其计算结果有小数而得不出想要的正确结果。
---------
按此要点进行了如下修正(参见标记红色的部分)。所列身份证号码全部校验通过。
身份证号码处理实例(修正) .mft (22.71 KB, 下载次数: 2224)

2. 计算公式
   编辑计算公式的字段:校验身份证号码

修改后的公式:
if(MFISNULL($MF(输入身份证号码)$),"",if(len($MF(输入身份证号码)$)=18,$MF(输入身份证号码)$,MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15)&if(round(mod(12-round(MOD((VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),1,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),2,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),3,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),4,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),5,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),6,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),7,1))*2+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),8,1))*1+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),9,1))*6+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),10,1))*3+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),11,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),12,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),13,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),14,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),15,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),16,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),17,1))*2),11),0),11),0)=10,"X",mid(round(mod(12-round(MOD((VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),1,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),2,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),3,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),4,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),5,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),6,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),7,1))*2+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),8,1))*1+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),9,1))*6+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),10,1))*3+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),11,1))*7+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),12,1))*9+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),13,1))*10+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),14,1))*5+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),15,1))*8+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),16,1))*4+VALUE(MID(MID($MF(输入身份证号码)$,1,6)&"19"&MID($MF(输入身份证号码)$,7,15),17,1))*2),11),0),11),0),1,1))))


(4)公式名称:校验18位身份证号码的校验码3

修改后的公式:

if(MFISNULL($MF(输入身份证号码)$),true,if(len($MF(输入身份证号码)$)=18,right($MF(输入身份证号码)$,1)=if(round(mod(12-round(MOD((VALUE(MID($MF(输入身份证号码)$,1,1))*7+VALUE(MID($MF(输入身份证号码)$,2,1))*9+VALUE(MID($MF(输入身份证号码)$,3,1))*10+VALUE(MID($MF(输入身份证号码)$,4,1))*5+VALUE(MID($MF(输入身份证号码)$,5,1))*8+VALUE(MID($MF(输入身份证号码)$,6,1))*4+VALUE(MID($MF(输入身份证号码)$,7,1))*2+VALUE(MID($MF(输入身份证号码)$,8,1))*1+VALUE(MID($MF(输入身份证号码)$,9,1))*6+VALUE(MID($MF(输入身份证号码)$,10,1))*3+VALUE(MID($MF(输入身份证号码)$,11,1))*7+VALUE(MID($MF(输入身份证号码)$,12,1))*9+VALUE(MID($MF(输入身份证号码)$,13,1))*10+VALUE(MID($MF(输入身份证号码)$,14,1))*5+VALUE(MID($MF(输入身份证号码)$,15,1))*8+VALUE(MID($MF(输入身份证号码)$,16,1))*4+VALUE(MID($MF(输入身份证号码)$,17,1))*2),11),0),11),0)=10,"X",mid(round(mod(12-round(MOD((VALUE(MID($MF(输入身份证号码)$,1,1))*7+VALUE(MID($MF(输入身份证号码)$,2,1))*9+VALUE(MID($MF(输入身份证号码)$,3,1))*10+VALUE(MID($MF(输入身份证号码)$,4,1))*5+VALUE(MID($MF(输入身份证号码)$,5,1))*8+VALUE(MID($MF(输入身份证号码)$,6,1))*4+VALUE(MID($MF(输入身份证号码)$,7,1))*2+VALUE(MID($MF(输入身份证号码)$,8,1))*1+VALUE(MID($MF(输入身份证号码)$,9,1))*6+VALUE(MID($MF(输入身份证号码)$,10,1))*3+VALUE(MID($MF(输入身份证号码)$,11,1))*7+VALUE(MID($MF(输入身份证号码)$,12,1))*9+VALUE(MID($MF(输入身份证号码)$,13,1))*10+VALUE(MID($MF(输入身份证号码)$,14,1))*5+VALUE(MID($MF(输入身份证号码)$,15,1))*8+VALUE(MID($MF(输入身份证号码)$,16,1))*4+VALUE(MID($MF(输入身份证号码)$,17,1))*2),11),0),11),0),1,1)),true))
回复

使用道具 举报

cndfy 发表于 2011-11-29 15:28:25 | 显示全部楼层
好长的公式,看着就眼晕。。。
回复

使用道具 举报

scqianlima 发表于 2018-12-18 23:05:50 | 显示全部楼层
不会用,直接导入修正的模板使用,提示未知错误;需要将回写公式都写上吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则


Archiver|手机版|小黑屋|魔方软件 ( 京ICP备08008787号 )

京公网安备 11010702001722号

GMT+8, 2024-6-18 20:48 , Processed in 0.089564 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表