poniedziałek, 16 kwietnia 2012

Prosty walidator PESEL - C#

Nazwa PESEL pochodzi od "Powszechny elektroniczny system ewidencji ludności". Numer składa się zawsze z 11 cyfr, z których:
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();
        }
    }
}

4 komentarze:

  1. Nie działa dla 82018228861 (pesel poprawny ale data nie)

    OdpowiedzUsuń
    Odpowiedzi
    1. Jak pesel może być poprawny jak dzień 82 nie istnieje w kalendarzu?

      Usuń
    2. Jak pesel może być poprawny jak dzień 82 nie istnieje w kalendarzu?

      Usuń
  2. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń