//校验手机号  
function
 IsMobileNumber( num:string ):boolean;
  begin
    Result:=False;
    if length( trim( Num ) ) <> 11 then Exit;
    if ( ( copy( num, 12) <> '13' and ( copy( num , 12) <> '15' ) ) then Exit;
    try
      StrToInt( copy( num, 39 ) );
      Result:=True;
    except
    end;
  end;

//校验身份证,合法返回字符1,否则返回格式错误信息
function ValidatePID(const APID: string): string;
  {内部函数,取身份证号校验位,最后一位,对18位有效}
  function GetVerifyBit(sIdentityNum: string): Char;
  var
    nNum: Integer;
  begin
    Result := #0;
    nNum := StrToInt(sIdentityNum[1]) * 7
      StrToInt(sIdentityNum[2]) * 9
      StrToInt(sIdentityNum[3]) * 10
      StrToInt(sIdentityNum[4]) * 5
      StrToInt(sIdentityNum[5]) * 8
      StrToInt(sIdentityNum[6]) * 4
      StrToInt(sIdentityNum[7]) * 2
      StrToInt(sIdentityNum[8]) * 1
      StrToInt(sIdentityNum[9]) * 6
      StrToInt(sIdentityNum[10]) * 3
      StrToInt(sIdentityNum[11]) * 7
      StrToInt(sIdentityNum[12]) * 9
      StrToInt(sIdentityNum[13]) * 10
      StrToInt(sIdentityNum[14]) * 5
      StrToInt(sIdentityNum[15]) * 8
      StrToInt(sIdentityNum[16]) * 4
      StrToInt(sIdentityNum[17]) * 2;
    nNum := nNum mod 11;
    case nNum of
      0: Result := '1';
      1: Result := '0';
      2: Result := 'X';
      3: Result := '9';
      4: Result := '8';
      5: Result := '7';
      6: Result := '6';
      7: Result := '5';
      8: Result := '4';
      9: Result := '3';
      10: Result := '2';
    end;
  end;
var
  L: Integer;
  sCentury: string;
  sYear2Bit, sYear4Bit: string;
  sMonth: string;
  sDate: string;
  iCentury: Integer;
  iMonth: Integer;
  iDate: Integer;
  CRCFact: string; //18位证号的实际值
  CRCTh: string; //18位证号的理论值
  FebDayAmt: Byte; //2月天数
begin
  L := Length(APID);
  if (L in [15, 18]) = False then
  begin
    Result := Format('身份证号不是15位或18位(%0:s, 实际位数:%1:d)', [APID, L]);
    Exit;
  end;
  CRCFact := '';
  if L = 18 then
  begin
    sCentury := Copy(APID, 7, 2);
    iCentury := StrToInt(sCentury);
    if (iCentury in [18..20]) = False then
    begin
      Result := Format('身份证号码无效:18位证号的年份前两位必须在18-20之间(%0:S)', [sCentury]);
      Exit;
    end;
    sYear2Bit := Copy(APID, 9, 2);
    sYear4Bit := sCentury sYear2Bit;
    sMonth := Copy(APID, 11, 2);
    sDate := Copy(APID, 13, 2);
    CRCFact := Copy(APID, 18, 1);
  end else
  begin
    sCentury := '19';
    sYear2Bit := Copy(APID, 7, 2);
    sYear4Bit := sCentury sYear2Bit;
    sMonth := Copy(APID, 9, 2);
    sDate := Copy(APID, 11, 2);
  end;
  iMonth := StrToInt(sMonth);
  iDate := StrToInt(sDate);
  if (iMonth in [01..12]) = False then
  begin
    Result := Format('身份证号码无效:月份必须在01-12之间(%0:s)', [sMonth]);
    Exit;
  end;
  if (iMonth in [1, 3, 5, 7, 8, 10, 12]) then
  begin
    if (iDate in [01..31]) = False then
    begin
      Result := Format('身份证号码无效:日期无效,不能为零或超出当月最大值(%0:s)', [sDate]);
      Exit;
    end;
  end;
  if (iMonth in [4, 6, 9, 11]) then
  begin
    if (iDate in [01..30]) = False then
    begin
      Result := Format('身份证号码无效:日期无效,不能为零或超出当月最大值(%0:s)', [sDate]);
      Exit;
    end;
  end;
  if IsLeapYear(StrToInt(sCentury sYear2Bit)) = True then
  begin
    FebDayAmt := 29;
  end else
  begin
    FebDayAmt := 28;
  end;
  if (iMonth in [2]) then
  begin
    if (iDate in [01..FebDayAmt]) = False then
    begin
      Result := Format('身份证号码无效:日期无效,不能为零或超出当月最大值(%0:s)', [sDate]);
      Exit;
    end;
  end;
  if CRCFact <> '' then
  begin
    CRCTh := GetVerifyBit(APID);
    if CRCFact <> CRCTh then
    begin
      Result := Format('身份证号码无效:校验位(第18位)错:(%0:s)', [APID]);
      Exit;
    end;
  end;
  Result := '1';
end;

转载于:https://www.cnblogs.com/lrl45/p/5135462.html

Delphi:校验手机号及身份证号相关推荐

  1. JS校验手机号和身份证号格式

    1:校验手机号 //JS正则表达式校验手机号function isPoneAvailable(poneInput) {var myreg=/^[1][3,4,5,7,8][0-9]{9}$/;if ( ...

  2. 利用正则来验证姓名、手机号、身份证号

    开发工具与关键技术:Visual Studio 2015 正则 作者:孙水兵 撰写时间:2019年6月27 一. 效果 二. 用到的方法 test:test 方法检查字符串是否与给出的正则表达式模式相 ...

  3. 关于实现手机号,身份证号加密解密解决方案

    关于实现手机号,身份证号加密解密解决方案 要求: 1.不入侵任何业务逻辑 2.可以扩展解密解密字段 3.可以扩展加密解密算法 环境: jdk1.8.springMVC 解决方案: 基于自定义注解和my ...

  4. 正则表达式隐藏手机号、身份证号、台胞证、护照、回乡证中间几位数字信息

    隐藏规则: demo: /** * @des 隐藏员工隐私信息(手机号.身份证号.台胞证.护照.回乡证) * @rule 手机号的中间4位隐去,身份证号隐去中间8位,台胞证隐去中间8位,护照隐去中间4 ...

  5. BankCardUtils(根据银行卡号 获取 银行卡类型、银行名称和银行编码 自动格式化银行卡号、手机号、身份证号输入的工具类)

    BankCardUtils 根据银行卡号 获取 银行卡类型.银行名称和银行编码 自动格式化银行卡号.手机号.身份证号输入的工具类 效果图 特点 支持自动根据银行卡号获取出银行名称.银行编码.银行卡类型 ...

  6. MySQL 如何隐藏客户姓名、手机号或者身份证号中的部分信息

    文章目录 隐藏姓名中的姓氏或者名字 隐藏手机号中间的四位数 隐藏身份证号中间的四位数 大家好,我是只谈技术不剪发的 Tony 老师.很多应用系统在前端显示个人信息时,为了保护信息安全需要将姓名.手机号 ...

  7. Microsoft SQL Server 如何隐藏客户姓名、手机号或者身份证号中的部分信息

    文章目录 隐藏姓名中的姓氏或者名字 隐藏手机号中间的四位数 隐藏身份证号中间的四位数 总结 大家好,我是只谈技术不剪发的 Tony 老师.姓名.手机号.身份证号以及银行卡号等属于个人敏感信息.为了保护 ...

  8. PHP 正则表达式判断手机号和身份证号

    在PHP编写的程序中,为了保证代码本身的流程安全,少不了对数据流进行一些效验的工作.而PHP给我提供了正则表达式验证函数,我们可以很方便的通过正则表达式的验证函数,来检查数据流是否符合标准.这个时候就 ...

  9. BankCardUtils 根据银行卡号 获取 银行卡类型、银行名称和银行编码 自动格式化银行卡号、手机号、身份证号输入的工具类

    BankCardUtils 项目地址:nanchen2251/BankCardUtils  简介:根据银行卡号 获取 银行卡类型.银行名称和银行编码 自动格式化银行卡号.手机号.身份证号输入的工具类 ...

最新文章

  1. 关于bitnami redmine 的一些问题
  2. java内存溢出分析工具:jmap使用实战
  3. Go语言的三元表达式
  4. Android实现图片的高效批量加载
  5. input限制输入字符
  6. python中pip安装报错的一些总结
  7. 连版《三十六英雄》整理
  8. 全志平台Android系统wifi模组rtl8188eu移植调试记录
  9. BCDEDIT - 启动配置数据存储编辑器
  10. postfixcalc函数 java_结对编程--四则运算(Java)萧英杰 夏浚杰
  11. c语言实现求最大公约数的三种方法
  12. Python声音处理入门
  13. noip 2009 靶形数独
  14. Element Select选择器从服务器搜索数据,输入关键字进行查找(从服务器获得的数据有分页)
  15. DCM4CHE处理多帧图像
  16. K2 BPM_K2签约龙光地产,为集团实现“千亿目标”保驾护航_全球领先的工作流引擎...
  17. DeFi之道丨一文了解Uniswap v3 LP 自动化管理器
  18. 八点钟学院软件测试,急求普通话测试题,如果哪位同学有请转发好吗?
  19. java git打包iOS_懒人做iOS系列之jenkins+git+fir打包(xCode9)
  20. JFinal建立项目

热门文章

  1. 系统快捷方式java_java中这么创建界面快捷方式图标 代码
  2. Java教程:Java程序的运行过程(执行流程)分析
  3. python内存池_python内存监控工具memory_profiler和guppy的用法详解
  4. mvc html.radiobutton 选中,asp.net-mvc - 如何使用RadioButtonFor选择单选按钮中的任何一个并包含if else语句 - 堆栈内存溢出...
  5. java编写人机聊天_无聊 写了个人机对话的小程序 哈哈!
  6. 字符界面运行mysql_详解linux系列之字符界面下MySQL+apache+php的源代码安装
  7. 管理数据库计算机网络,计算机网络与数据库管理系统.pdf
  8. pathinfo函数获取非UTF-8字符集文件名的问题
  9. asp.net mysql helper_asp.net使用SQLHelper操作数据库
  10. spark 查看yarn日志_spark周边项目之Livy