лична карта алгоритъм

11 отговора 2187 прегледа
#1

лична карта алгоритъм

Знаете ли как се проверява номер на лична карта?

Отговор
в отговор на gigs #2

Re: лична карта алгоритъм


UNIT DDS_EGN;


INTERFACE


Function TaxNum_OK(Const TaxNum: String; Const AllowNull: Boolean = False): Boolean;
//проверка за коректност на данъчен номер.

Function EGN_Ok(Const EGN: String; Const AllowNull: Boolean = False): Boolean;
//Проверка за коректност на ЕГН.

Function BULSTAT_OK(Const BULSTAT: String; Const AllowNull: Boolean = False): Boolean;
//Проверка за коректност на деветцифров и тринадесетцифров код по Булстат.

Function BULSTAT_OK_9(BULSTAT: String): Boolean;
//проверка за коректност на деветцифров код по Булстат.

Function BULSTAT_OK_13(BULSTAT: String): Boolean;
//проверка за коректност за тринадесетцифров код по Булстат.


IMPLEMENTATION


Function TaxNum_OK(Const TaxNum: String; Const AllowNull: Boolean = False): Boolean;
Var i, B, Code, CheckSum: Integer;
Begin
Result:=False;
If TaxNum='' Then Begin
Result:=AllowNull;
Exit;
End
Else If Length(TaxNum)<>10 Then
Exit;

For i:=1 To 10 Do
If Not(TaxNum In ['0'..'9']) Then
Exit;

CheckSum:=0;
Val(TaxNum[1], B, Code);
Inc(CheckSum, B*4);
Val(TaxNum[2], B, Code);
Inc(CheckSum, B*3);
Val(TaxNum[3], B, Code);
Inc(CheckSum, B*2);
For i:=4 To 9 Do Begin
Val(TaxNum, B, Code);
Inc(CheckSum, B*(11-i));
End; //For
Val(TaxNum[10], B, Code);
CheckSum:=(11-(CheckSum mod 11)) mod 11;
//външното mod 11 е от 28.01.98, т.к. в описанието не се предполага остатък 0.
Result:=Not((CheckSum=10)Or(CheckSum<>B));
End; //TaxNum_OK

Function EGN_Ok(Const EGN: String; Const AllowNull: Boolean = False): Boolean;
Const
Arr: Array[1..9] Of Byte = (2,4,8,5,10,9,7,3,6);
Var
Sum, i, Numb, Code: Integer;
Begin
Result:=False;

If EGN='' Then Begin
Result:=AllowNull;
Exit;
End
Else If Length(EGN)<>10 Then
Exit;

Sum:=0;
For i:=1 To 9 Do Begin
Val(EGN, Numb, Code);
Inc(Sum, numb*arr);
End; //For
Sum:=Sum mod 11;
If Sum=10 Then
Sum:=0;
Val(EGN[10], Numb, Code);
If Sum=Numb Then
Result:=True;
End; //EGN_Ok


Function BULSTATSum(TestStr : String;_s, _f, Offset:byte):LongInt;

Var
ic : byte;
Code,ValCode : Integer;
BuffSum : LongInt;

Begin
BuffSum := 0;
For ic := _s To _f Do
Begin
Val(TestStr[ic - Offset], Code, ValCode);
Inc(BuffSum, ic * Code);
End; { For ic }
BULSTATSum := BuffSum;
End; { BULSTATSum }

Function BULSTAT_OK_9(BULSTAT: String):Boolean;
Var CheckNum, ic: byte;
Code,ValCode: Integer;
Begin
Val(BULSTAT[9], CheckNum, ValCode);
Case (BULSTATSum(BULSTAT,1, 8, 0)Mod 11) Of
10: If (BULSTATSum(BULSTAT,3, 10, 2)Mod 11)=10 Then
Code:=Byte(CheckNum<>0)
Else
Code:=Byte((BULSTATSum(BULSTAT,3, 10, 2)Mod 11)<>CheckNum);
Else //Case
Code:=Byte((BULSTATSum(BULSTAT,1, 8, 0)Mod 11)<>CheckNum);
End; //Case
{31.5.1999 Петя
If (Code > 0) Then Message('Невалиден БУЛСТАТ !');}
Result:=Code=0;
End; { BULSTAT_OK_9 }

Function BulstatSum13(TestStr : String;
Digit9,Offset : Byte): LongInt;
Var
ic : byte;
Code,ValCode : Integer;
BuffSum : LongInt;

Begin
BuffSum := Digit9 * (2 + Offset);
For ic := 10 To 12 Do
Begin
Val(TestStr[ic], Code, ValCode);
case ic of
10 : Inc(BuffSum, (7+Offset) * Code);
11 : Inc(BuffSum, (3+Offset) * Code);
12 : Inc(BuffSum, (5+Offset) * Code);
End; {case}
End; { For ic }
BulstatSum13 := BuffSum;
End; { BULSTATSum }

Function BULSTAT_OK_13(BULSTAT: String):Boolean;
Var CheckNum, ic, Digit9: byte;
Code,ValCode: Integer;
Sum: LongInt;
Begin
Val(BULSTAT[13], CheckNum, ValCode);
//определяне на деветата цифра с помощта на алгоритъма за деветцифрения код по Булстат.
Digit9:=BULSTATSum(BULSTAT,1, 8, 0)Mod 11;
If Digit9=10 Then Begin
Digit9:=BULSTATSum(BULSTAT, 3, 10, 2)Mod 11;
If Digit9=10 Then
Digit9:=0;
End;
//определяне на деветата цифра
Sum:=BulstatSum13(BULSTAT, Digit9, 0);

Case (Sum mod 11) Of
10: If (BulstatSum13(BULSTAT, Digit9, 2)Mod 11)=10 Then
Code:=Byte(CheckNum<>0)
Else
Code:=Byte((BulstatSum13(BULSTAT, Digit9, 2)Mod 11)<>CheckNum);
Else //Case
Code:=Byte((Sum Mod 11)<>CheckNum);
End; //Case

Result:=Code=0;
End; //BULSTAT_OK_13

Function BULSTAT_OK(Const BULSTAT: String; Const AllowNull: Boolean = False): Boolean;
Var Len :Byte;
Begin
Result:=False;

If BULSTAT='' Then Begin
Result:=AllowNull;
Exit;
End;

Len:=Length(BULSTAT);
Case Len of
9,10: Result:=Bulstat_OK_9(BULSTAT);
13: Result:=Bulstat_OK_13(BULSTAT);
End; //case
End; //Bulstat_Ok






End.


Отговор
в отговор на Nazarov #3

Ценна информация (и поне 2 печатни грехки :)

Например:
TaxNum >>> TaxNum
arr >>> arr

Отговор
в отговор на NikB #4

Re: Ценна информация (и поне 2 печатни грехки :)

Да бяха само печатните... Кода е "почти напълно" неработоспособен, защото скрипта на форума е преобразувал всички индексирания спрямо I (т.е. I в квадратни скоби) като указание за наклонен шрифт... Не е виновен човека...
Освен това главния въпрос остава отворен - има ли изобщо такова животно като контрол на номера на личната карта?

Отговор
в отговор на Mandor #5

Re: Ценна информация (и поне 2 печатни грехки :)

Ами клаузата
 не работи ли?

Май и на мен ми се налагаше да сменям I с K :)

PP
имах предивид "pre" в квадратни скобки :)

Редактирано от NikB на

Отговор
в отговор на NikB #6

Re: Ценна информация (и поне 2 печатни грехки :)



Italic

не работи явно



Отговор
в отговор на Nazarov #7

Re: лична карта алгоритъм

Публикуваите кода коректно или го качете някъде и дайте линк за да се дръпне

Отговор
в отговор на Nazarov #8

Re: лична карта алгоритъм

благодаря за кода но аз питах за проверка на лична карта
някой правил ли е?

Отговор
в отговор на Nazarov #9

bool ValidateEGN(CString sValue)

bool ValidateEGN(CString sValue)
{
int i;

// Length
if (sValue.GetLength() != 10) {
return false;
}

// Valid Chars
for (i = 0; i < sValue.GetLength(); i++) {
if ((sValue < '0') || (sValue > '9')) {
return false;
}
}

// Year
int year = char2int(sValue[0]) * 10 + char2int(sValue[1]);

// Month
int month = char2int(sValue[2]) * 10 + char2int(sValue[3]);
if ((month < 1) || (month > 12)) {
return false;
}

// Day
int day = char2int(sValue[4]) * 10 + char2int(sValue[5]);
if ((day < 1) || (day > 31)) {
return false;
}

// Check Sum
int checkSum = 0;
const int EGN_Weights[9] = {2,4,8,5,10,9,7,3,6};
for (i = 0; i < 9; i++) {
checkSum += EGN_Weights * char2int(sValue);
}
checkSum %= 11;
checkSum %= 10;
if (checkSum != char2int(sValue[9])) {
return false;
}

return true;
}

Отговор
в отговор на gigs #10

Re: лична карта алгоритъм

С деление по модул 11 - както кода за ЕГН. Това са теглата:
2,4,8,5,10,9,7,3

Отговор
в отговор на Beco_ #11

Re: лична карта алгоритъм

Пробвах го наистина работи по същият начин като за ЕГН, но с една цифра по-малко, както е номера на лична карта.
Между другото абсолютно същото като за лична карта е и за шофьорска книжка.
Новите ДДС номера, логично се проверяват по алгоритъма за Булстат, като имате в предвид че отпред има BG

Отговор
в отговор на motion #12

Re: лична карта алгоритъм

Относно новите ДДС номера /VAT номер/ те са съставени BG+булстат или BG+ЕГН. Съответно се проверяват аналогично. На сайта на НАП има регистър с активните регистрираби по ДДС.

Отговор