1. Pierwsze 6 cyfr stanowi datę urodzenia (ddmmyy)*
* dla numerów PESEL z lat 2000 - 2099 do liczby miesięcy dodajemy 20! (np 103010 stanowi 10.10.2010)
2. cyfry od 7 do 10 to numer serii wraz z kodem płci (płeć to cyfra dziesiąta. Parzyste to żeńska, nieparzyste - męska)
3. cyfra 11 stanowi cyfrę kontrolną
Cyfrę kontrolną obliczamy mnożąć kolejne cyfry (od 1 do 10) przez następujące wagi (kolejno):
{1, 3, 7, 9, 1, 3, 7, 9, 1, 3}
iloczyny sumujemy. Następnie otrzymaną sumę dzielimy przez 10.
a. jeśli w wyniku otrzymamy 0 i jedenasta cyfra numeru PESEL to 0 - numer jest poprawny
b. jeśli uzyskaliśmy wynik inny niż 0, odejmujemy ją od 10. Jeśli wynik odejmowania jest równy jedenastej cyfrze numeru PESEL - numer jest poprawny. Jeśli nie - jest błędny.
Poniżej opisany algorytm w implementacji C#:
/*
* Created by SharpDevelop.
* User: PJ
* Date: 2012-04-10
* Time: 21:35
*
*/
using System;
namespace Validators
{
/// <summary>
/// Klasa statyczna PeselValidator.
/// </summary>
public static class PeselValidator
{
/// <summary>
/// Mnozniki dla PESEL
/// </summary>
private static readonly int[] mnozniki = {1, 3, 7, 9, 1, 3, 7, 9, 1, 3};
/// <summary>
/// Sprawdza PESEL pod kątem poprawności
/// </summary>
/// <param name="pesel">PESEL string</param>
/// <returns>true = OK; false = NOK</returns>
public static bool ValidatePesel(string pesel)
{
bool toRet = false;
try
{
if(pesel.Length == 11)
{
toRet = CountSum(pesel).Equals(pesel[10].ToString());
}
}
catch(Exception)
{
toRet = false;
}
return toRet;
}
/// <summary>
/// Liczy sumę cyfr znaczących PESEL
/// </summary>
/// <param name="pesel">PESEL string</param>
/// <returns>SUMA string</returns>
private static string CountSum(string pesel)
{
int sum = 0;
for(int i = 0; i < mnozniki.Length; i++)
{
sum+=mnozniki[i]*int.Parse(pesel[i].ToString());
}
int reszta = sum%10;
return reszta == 0 ? reszta.ToString() : (10-reszta).ToString();
}
}
}