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, 5, 8, 4, 2};class IdNumVerify
{
public:IdNumVerify(const string &strIDNum);int weightedSum();char checkCode();bool isValid();private:string     _strIDNum;
};#endif // IDNUMVERIFY_H

2)idnumverify.cpp

#include "idnumverify.h"IdNumVerify::IdNumVerify(const string &strIDNum): _strIDNum((strIDNum))
{
}int IdNumVerify::weightedSum()
{int sum = 0;if (_strIDNum.length() >= kNumLength) {for (int i = 0; i < kNumLength; ++i) {sum += (_strIDNum[i] - '0') * kWeightFactor[i];}}return sum;
}char IdNumVerify::checkCode()
{int k = weightedSum() % 11;if (k == 0)return '1';else if (k == 1)return '0';else if (k == 2)return 'X';elsereturn '0'+12-k;
}bool IdNumVerify::isValid()
{bool bRet = false;if (_strIDNum.length() == kIdNumLength) {if (checkCode() == _strIDNum[kIdNumLength - 1]) {bRet = true;} else {bRet = false;}}return bRet;
}

3、测试Demo

博主使用Qt验证该类的准确性,主要代码如下:

1)对话框头文件

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>class Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void init();private slots:void onVerifyClicked();void onClearClicked();private:QLabel      *_lblIdNum;QLineEdit   *_edtIdNum;QLabel      *_lblEffective;QLineEdit   *_edtEffective;QPushButton *_btnVerify;QPushButton *_btnClear;QPushButton *_btnExit;
};
#endif // DIALOG_H

2)对话框源文件

#include "dialog.h"
#include "idnumverify.h"
#include <QGridLayout>
#include <QRegExpValidator>Dialog::Dialog(QWidget *parent): QDialog(parent)
{init();
}Dialog::~Dialog()
{
}void Dialog::init()
{_lblIdNum = new QLabel(tr("身份证号:"));_edtIdNum = new QLineEdit;_edtIdNum->setFixedWidth(220);_edtIdNum->setFixedWidth(220);QRegExp regExp(tr("^[0-9]{17}[0-9|X]?$"));QRegExpValidator *pRegExpValid = new QRegExpValidator(regExp, this);_edtIdNum->setValidator(pRegExpValid);_lblEffective = new QLabel(tr("是否有效?"));_edtEffective = new QLineEdit;_edtEffective->setReadOnly(true);_btnVerify = new QPushButton(tr("验证"));_btnClear = new QPushButton(tr("清空"));_btnExit = new QPushButton(tr("退出"));_btnVerify->setFixedSize(QSize(90, 36));_btnClear->setFixedSize(QSize(90, 36));_btnExit->setFixedSize(QSize(90, 36));QFont ft(tr("宋体"), 14);_lblIdNum->setFont(ft);_edtIdNum->setFont(ft);_lblEffective->setFont(ft);_edtEffective->setFont(ft);_btnVerify->setFont(ft);_btnClear->setFont(ft);_btnExit->setFont(ft);connect(_btnVerify, SIGNAL(clicked()), this, SLOT(onVerifyClicked()));connect(_btnClear, SIGNAL(clicked()), this, SLOT(onClearClicked()));connect(_btnExit, SIGNAL(clicked()), this, SLOT(close()));QGridLayout* gridLay = new QGridLayout(this);gridLay->setMargin(16);gridLay->setSpacing(16);gridLay->addWidget(_lblIdNum, 0, 0);gridLay->addWidget(_edtIdNum, 0, 1, 1, 2);gridLay->addWidget(_lblEffective, 1, 0);gridLay->addWidget(_edtEffective, 1, 1, 1, 2);gridLay->addWidget(_btnVerify, 2, 0);gridLay->addWidget(_btnClear, 2, 1);gridLay->addWidget(_btnExit, 2, 2);
}void Dialog::onVerifyClicked()
{std::string strIdNum = _edtIdNum->text().toStdString();IdNumVerify objVerify(strIdNum);if (objVerify.isValid()) {_edtEffective->setText(tr("^○^ 身份证号有效!"));} else {_edtEffective->setText(tr("ˇ‸ˇ 身份证号无效!"));}
}void Dialog::onClearClicked()
{_edtIdNum->clear();_edtEffective->clear();
}

3)验证结果

本文篇幅较长,SFZ的生成规则及代码在下一篇博文中介绍。

C++:18位SFZ号码有效性验证相关推荐

  1. 15/18位身份证号码验证的正则表达式总结(详细版)

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  2. MySQL正则表达式判断身份证_15/18位身份证号码验证的正则表达式总结(详细版)...

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  3. python正则表达式 身份证_15/18位身份证号码验证的正则表达式总结(详细版)

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  4. 18位身份证号码规则及js验证

    2019独角兽企业重金招聘Python工程师标准>>> 一.中国居民身份证号码规则 18位身份证号码编码规则:根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份 ...

  5. 15/18位身份证号码验证

    15/18位身份证号码验证 在做身份证验证之前你得明确身份证号的组成. 首先我告诉你,18位身份证号码后面的字母只有"X"这一个.(X是罗马数字的10,用X来代替10,可以保证您的 ...

  6. js正则表达式 - 验证11位手机号码、邮箱验证、18位身份证号码

    正则解析 11位手机号码 reg表达式:/^[1][3,4,5,7,8][0-9]{9}$/ 规则:第一个数字1,第二个数字只能是3,4,5,7,8中的某一个,剩下的号码需要有9个数,范围在0-9之间 ...

  7. python 身份证号码有效性验证

    先声明以下代码不是全部原创,网上找了前辈的一些代码,经过自己的部分加工,有了如下的身份证有效性验证代码: #!/usr/bin/env python3 # -*- coding: utf-8 -*-i ...

  8. Js实现中国公民身份证号码有效性验证

    2019独角兽企业重金招聘Python工程师标准>>> 参考: Java实现中国公民身份证号码有效性验证 Php实现中国公民身份证号码有效性验证 本文将使用JavaScript实现中 ...

  9. js实现身份证号码有效性验证

    //Js获取日期.月初时的前天.昨天.今天.明天 function getDay(day) {var today = new Date();var targetday_milliseconds = t ...

最新文章

  1. 关于mysql的项目_项目中常用的MySQL 优化
  2. 深入ASP.NET MVC之七:ActionResult的执行(View的加载和渲染)
  3. 如何MATLAB中将一个向量或者矩阵强行转换为列向量
  4. 简单易操作的跨浏览器JavaScript单元测试解决方案
  5. java参数传递的乱码问题
  6. git rebase简介(基本篇)
  7. 20100929 朝会内容
  8. codeforces 733D
  9. 【双十一精选】史上最强的宝贝详情页设计思路以及操作流程
  10. 什么短视频更吸引人?考虑到三点,吸粉引流不在话下
  11. 联通家庭宽带光猫DDNS设置
  12. 少模光纤模式场的计算
  13. python鼠标移动的方法_python自动化之鼠标移动
  14. el-upload上传图片,限制上传数量,超过最大数量则不展示上传组件,可点击删除
  15. 锁存器(latch)和触发器(filp-flop)的概念和区别?为什么多用register。行为级描述中latch如何产生的?
  16. 平面设计素材|黑白海报设计,暗黑潮流
  17. Android直播软件搭建左滑右滑清屏控件
  18. 有哪些简单好用的国产数据库?
  19. 局部路径规划算法-DWA动态窗口法
  20. 新款趣味测试小程序源码_测试可用

热门文章

  1. 国防科技大学计算机非军籍研究生就业情况,国防科技大学2020届无军籍毕业生基本情况...
  2. 学习AJAX必知必会(2)~Ajax基本使用,设置请求行、请求体、请求头,服务端响应JSON数据
  3. 股票软件数据api接口包含哪些部分?
  4. thinkphp集成swagger
  5. 精美flash课件制作全攻略
  6. IT学习小册子地址收藏
  7. php 抽奖思路,想用PHP做抽奖系统,思路..
  8. 论文查重是查哪些部分?
  9. E. Polycarp and Snakes
  10. 计算机键盘按键的尺寸,台式电脑键盘尺寸是多少