内容简介
本篇推送,将简单介绍一下怎么使用FME来验证身份证号码。
身份证号码
结构:
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位地址码,八位出生日期码,三位顺序码和一位校验码。
形式
1.地址码
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
2.出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
3.顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
4.校验码
根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
校验码算法
将本体码各位数字乘以对应加权因子并求和,除以11得到余数,根据余数通过校验码对照表查得校验码。
加权因子:
校验码:
身份证号码验证
了解过身份证的组成以及验证规则之后,下面就要开始验证了。
验证方式
身份证号的验证,可以分为这么几个部分:1、地址码验证,2、出生日期验证,3、顺序码验证,4、校验码验证。其中地址码验证比较简单,只需提取出身份证的前6位,与县级行政区划代码做个验证即可。顺序码的验证,只需将第17位提取出来做奇偶性与性别的验证即可。所以接下来的验证将着眼于两部分:日期与校验码!
日期校验
要验证身份证中的日期,首先要把日期信息提取出来。提取身份证的日期有多种方式,这里只介绍三种
1、根据字符串索引提取
这种方式是最简单的,直接根据数字的位置就可以把身份证种的日期提取出来,使用到的转换器如下图所示:
提取结果
2、使用字符串分割提取
这种方式稍微麻烦一些,需要根据熟悉一点格式化字符串的知识,不过在配置的时候是非常方便的,使用到的转换器如下图所示:
提取结果
3、使用正则的方式进行提取
正则方式最为优雅强大,一个转换器即可提取出日期信息
提取结果
以上三种方式都能提取出日期信息,而验证也非常的简单,直接使用日期转换的方式进行验证即可,能转换成功的,就是正常的日期,不成功就是有问题的日期
开始验证
直接使用日期转换的转换器,对提取出的转换器进行了验证,在运行的时候,下方的日志栏就出现了提示。提示说19850230这个日期,天数太大了,不是个有效的日期。所以这个身份证号码是有问题的。
验证码验证
根据身份证的验证码规则,需要将身份证的每一位乘上其加权因子,然后再与11取余,得到的余数再到对应的校验码表中,查找对应的校验码。这个计算过程,使用转换器来实现的话是非常麻烦的,所以我写了几行代码来实现,转换器如下图所示:
这个结果是不是正确,可以在Excel里计算验证一下(Excel的公式也是非常的强大)
首先,对两个身份证进行加权求和,及:两个身份证分别与其位置上的加权因子相乘
最后求和
可以看到,这里求的和,跟上面的转换器算的结果是一致的
然后再取余,验证校验码
可以看到,求出的余数与校验码与转换器算出来的结果也是一致的。这说明写的转换器,效果还是可以的!