1、SFZ验证规则
18位SFZ号码由十七位数字本体码和一位数字校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
其校验码(最后一位)计算方法和步骤为:
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
其中Ai:表示第i位置上的SFZ号码数字值
Wi:表示第i位置上的加权因子,前17位加权因子从左到右分别为 :7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模 Y = mod(S, 11)
(3)通过模Y查下表得到对应的校验码:
模值Y 0 1 2 3 4 5 6 7 8 9 10
校验码 1 0 X 9 8 7 6 5 4 3 2
18位SFZ号码的正则表达式如下:
^\d{17}[\d|X]?$
如果不想使用转义字符,就写成以下形式:
^[0-9]{17}[0-9|X]?$
注:15位SFZ号码比较简单,这里就不描述了
2、SFZ号码有效性验证封装类
根据SFZ号码的验证规则,博主将其封装成一个C++通用类,只需传入SFZ号码,便可根据该类轻易的判断出SFZ号码是否有效,代码如下:
1)idnumverify.h
#ifndef IDNUMVERIFY_H
#define IDNUMVERIFY_H
#include <string>
using std::string;
const int kNumLength = 17; // 数字本体码长度
const int kIdNumLength = 18; // SFZ号码长度
// 加权因子
const int kWeightFactor[kNumLength] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10

本文介绍18位SFZ号码的验证规则,包括号码结构、校验码计算方法及正则表达式,并提供了一个C++实现的验证类。
最低0.47元/天 解锁文章
367

被折叠的 条评论
为什么被折叠?



