输入身份证号码自动读取生日与性别(delphi)

一、格式介绍:

【15位号码格式】

1、第l一6位数为行政区划代码;

2、第7-12位数为出生日期代码;

3、第13---15位数为分配顺序代码;

(1)、行政区划代码,是指公民第一次申领居民身份证时的常住户口所在地的行政地区。

(2)、出生日期代码,第7-8位数代表年份(年份前面二位数省略),第9-10位数代表月份(月份为l位数的前面加零)。第11一12位数代表日期(日期为1位数的前面加零)。

(3)、分配顺序代码,是按人口数统一合理分配以固定顺序给予每个人的顺序号,最末一位数是奇数的分配给男性,偶数分配给女性。

【18位号码格式】

1. 1~6位为地区代码;

(其中1、2位数为各省级政府的代码,3、4位数为地、市级政府的代码,5、6位数为县、区级政府代码。)

2. 7~14位为出生年月日

3.15~17位为顺序号,是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如:007的就是个男生 而且和他同年月日生的男生至少有两个 他们的后四位是001* 和 003*

4.18位为效验位(识别码),通过复杂公式算出,普遍采用计算机自动生成。是前面17位的一种检验代码,如果你改变了前面某个数字而后面的效验代码不响应改变就会被计算软件判断为非法身份正号码。X也是效验代码的一种,代表数字10;

二.代码部分:

功能:
 1.实现身份号码的有效性检查
 2.实现身份号码出生日期与性别自动匹配

//检查身份证号码是否为有效
function CheckIDCard(IDCard: String):Boolean;
const
  OLD_LENGTH = 15; //15位长度
  NEW_LENGTH = 18; //18位长度
  DaysOfMonths: array [1..12] of Integer = (31,28,31,30,31,30,31,31,30,31,30,31); //月天数数组
  DaysOfMonths1: array [1..12] of Integer = (31,29,31,30,31,30,31,31,30,31,30,31);
var
  Len: Integer;
  AYear,AMonth,ADay : Integer;
  function IsNum(Value: String):Boolean;
  var
    I: Integer;
  begin
    Result := True;
    for I:=1 to Length(Value) do
    begin
      if not(Value[I] in[‘0‘..‘9‘]) then
      begin
        Result := False;
        Exit;
      end;
    end;
  end;
begin
  Result := False;
  Len := length(IDCard);
  if (Len<>OLD_LENGTH) and (Len<>NEW_LENGTH) then Exit;
  //检查是否为数字
  if Len = OLD_LENGTH then
  begin
    //15位
    if Not IsNum(IDCard) then Exit;
    AYear := StrToInt(‘19‘+Copy(IDCard,7,2));
    AMonth := StrToInt(Copy(IDCard,9,2));
    ADay := StrToInt(Copy(IDCard,11,2));
  end else
  begin
    //18位
    if IDCard[NEW_LENGTH] = ‘X‘ then
    begin
      if Not IsNum(Copy(IDCard,1,NEW_LENGTH-1)) then Exit;
    end else
    begin
      if Not IsNum(IDCard) then Exit;
    end;
    //检查校验位
    if IDCard[NEW_LENGTH] <> IDCardCheckSum(IDCard) then Exit;
    AYear := StrToInt(Copy(IDCard,7,4));
    AMonth := StrToInt(Copy(IDCard,11,2));
    ADay := StrToInt(Copy(IDCard,13,2));
  end;
  //检查年月日的有效性
  if not(AMonth in[1..12]) then Exit;
  if(IsLeapYear(AYear)) then
  begin
    if not(ADay in[1..DaysOfMonths1[AMonth]]) then Exit;
  end else
  begin
    if not(ADay in[1..DaysOfMonths[AMonth]]) then Exit;
  end;
  Result := True;
end;

//将15的身份证号码转换为18位
function IDCardTo18(IDCard: string):string;
const
  OLD_LENGTH = 15;
var
  newid: string;
begin
  if length(IDCard) <> OLD_LENGTH then
  begin
    result:= IDCard;
    Exit;
  end
  else begin
    newid:= IDCard;
    insert(‘19‘, newid, 7);
    result:= newid + IDCardCheckSum(IDCard);
  end;
end;

//代码实现部分
procedure TForm1.Query1idcardSetText(Sender: TField;const Text: String);
var
  __Text,__S: String;
  __idcard:string;
 __b : boolean;
 __sex:Integer;
begin
  inherited;
  __Text := Text;
  if __Text = ‘‘ then Exit;
  __idcard:=__text;
  __b:= CheckIDCard(__Text);   //调用CheckIDCard函数,检查号码的有效性
  if (length(__idcard) >6) and (length(__idcard)<=12) then begin
  if ((Ord(__idcard[1])>=64) and (Ord(__idcard[1])<=126)) or ((length(__idcard)>6) and (length(__idcard)<=12))  then begin
    __b:=true;
  end;
  end;
  if __b then begin
    Sender.Value := __Text;
     //15位
if Length(__Text)=15 then begin
     //匹配出生日期;
     __S:=‘19‘+copy(__Text,7,2)+‘-‘+copy(__Text,9,2)+‘-‘+copy(__Text,11,2);
     Query1birthday.Value:=strtodate(__S);
     //匹配性别;
__sex:=StrToInt(__Text[15]);
     if __sex mod 2 =0 then begin
     Query1guestsex.Value:=1
     end else Query1guestsex.Value:=0
    end;
    //18位
    if Length(__Text)=18 then begin
    __S:=copy(__Text,7,4)+‘-‘+copy(__Text,11,2)+‘-‘+copy(__Text,13,2);
     Query1birthday.Value:=strtodate(__S);
     __sex:=StrToInt(__Text[17]);
     if __sex mod 2 =0 then begin
     Query1guestsex.Value:=1
     end else Query1guestsex.Value:=0
    end;
  end else
    raise Exception.Create(‘输入的身份证号码无效,请检查!‘);
end;
				
时间: 2024-11-05 19:31:45

输入身份证号码自动读取生日与性别(delphi)的相关文章

根据身份证号码自动获取出生日期,性别,籍贯

Q1:数据库 由于数据有点多,我们在这就不展示了(需要的联系我,我发给你) i 这是里面所用到的一些架包,包等等.相信大家对这一块都已经了解了,我就不说废话了. Q2:html文件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <s

C#根据身份证号码,计算生日、年龄、性别

朋友谈及身份证相关的信息,才了解到原来省份证号码中包含了年龄和性别. 这样在数据库中,就不必单独留字段存放它们了(不过,要根据具体情况来,要是读取频率较高,还是单独列出为好),这样顺带解决了年龄变更的问题. 程序仅仅为了实现这个功能,里面还是需要数据验证的,用户输入的信息,毕竟在猿类看来,都是“非法的”.废话不多说了,贴上我写的程序,还请路过的大神斧正: using System; using System.Collections.Generic; using System.Linq; usin

身份证号码自动生成程序(Python)

今天收到一个小需求:需要一个自动生成身份证号码的小程序.近期用python较多,因此打算用python实现. 需求细化: 1.身份证必须能够通过身份证校验程序. 2.通过查询,发现身份证号码是有国家标准的,标准号为  GB 11643-1999  可以从百度下载到这个文档http://zhidao.baidu.com/share/b838c7683bb70af8166efd810a398fec.html 现行身份证号为18位,分别为6位地址码,8位生日,3位顺序码,一位校验码.具体例子可见下图.

【代码笔记】传身份证号码可返回生日字符串

代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NSString *birthDay=[self birthdayStrFromIdentityCard:@"134825194401014241"]; NSLog(@"--birthDay-%@",birthDay); } //传身份证返回生日字符串 -(NSString

php提取身份证号码中的生日日期以及验证是否为未成年人的函数

php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括15位和18位身份证 function getIDCardInfo($IDCard){ $result['error']=0;//0:未知错误,1:身份证格式错误,2:无错误 $result['flag']='';//0标示成年,1标示未成年 $result['tdate']='';//生日,格式如:2012-

传身份证号码可返回生日字符串

代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NSString *birthDay=[self birthdayStrFromIdentityCard:@"134825194401014241"]; NSLog(@"--birthDay-%@",birthDay); } //传身份证返回生日字符串 -(NSString

vue表单:输入身份证号码则自动获取对应的年龄和性别,,若不输入身份证号则自己填写年龄和性别

<el-input :ref="item.meta.system_id" v-model="temp[item.meta.valueKey]" clearable oninput="if(value.length>18)value=value.slice(0,18)" :disabled="item.meta.disabled" :placeholder="item.meta.placeholder ?

Java验证身份证号码及提取生日信息

Java学习第一站,导师给布置的作业题,验证身份证号码的合法性并提取生日信息.第一次写Java代码,第一次用博客记录学习进程,略紧张,对Java变量的命名还停留在C++的命名法阶段,吼吼~~现在开始正题.问题说明:目前,我国大部分地区都使用的是第二代身份证,第二代身份证号码的位数为18位.但公安部没有下发统一的关于停用第一代身份证的文件,第一代身份证中有15位和18位身份证号的混用.15位身份证号码:排列顺序从左至右依次为:6位数字地址码,6位数字出生日期码,3位数字顺序码,其中出生日期码不包含

输入身份证号,得到生日

Console.WriteLine("请输入你的身份证号码:"); string a = Console.ReadLine(); string year = a.Substring(6, 4); string month = a.Substring(10, 2); string day = a.Substring(12, 2); Console.WriteLine("你的生日是{0}年{1}月{2}日", year, month, day);