Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 10:20 30.06.24 
Компютри и Интернет
   >> Delphi
Всички теми Следваща тема *Кратък преглед

Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема лична карта алгоритъмнови  
Авторgigs (Нерегистриран)
Публикувано18.07.04 16:22



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



Тема Re: лична карта алгоритъмнови [re: gigs]  
АвторNazarov (Нерегистриран)
Публикувано19.07.04 05:08




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.




Тема Ценна информация (и поне 2 печатни грехки :)нови [re: Nazarov]  
Автор NikB (любопитен)
Публикувано19.07.04 06:30



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



Тема Re: Ценна информация (и поне 2 печатни грехки :)нови [re: NikB]  
Автор Mandor (Sawall)
Публикувано19.07.04 06:36



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



Тема Re: Ценна информация (и поне 2 печатни грехки :)нови [re: Mandor]  
Автор NikB (любопитен)
Публикувано19.07.04 06:42



Ами клаузата

 не работи ли?

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

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

Редактирано от NikB на 19.07.04 11:15.



Тема Re: Ценна информация (и поне 2 печатни грехки :)нови [re: NikB]  
Автор mn_t (разпрашен)
Публикувано19.07.04 08:21





Italic

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





Тема Re: лична карта алгоритъмнови [re: Nazarov]  
Авторogi (Нерегистриран)
Публикувано19.07.04 19:35



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



Тема Re: лична карта алгоритъмнови [re: Nazarov]  
Авторgigs (Нерегистриран)
Публикувано20.07.04 11:59



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



Тема bool ValidateEGN(CString sValue)нови [re: Nazarov]  
Авторju (Нерегистриран)
Публикувано13.02.07 18:13



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;
}



Тема Re: лична карта алгоритъмнови [re: gigs]  
Автор Beco_ (Boogie chillun)
Публикувано14.02.07 09:38



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




Страници по тази тема: 1 | 2 | >> (покажи всички)
Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.