poniedziałek, 2 lipca 2012

Weryfikacja numeru pesel w MFC C++

Dzisiaj prezentuję funkcję weryfikującą numer Pesel.
Funkcja sprawdza zgodność numerów pesel z zakresu 1800 - 2200 roku (w przybliżeniu).
Weryfikowana jest suma kontrolna oraz logika zapisu samego numeru pesel.
Funkcja zwraca true - jeśli numer pesel jest poprawny, false jeśli błędny.

BOOL CheckPesel(CString a_Pesel)
{
    BOOL res=false;
    BOOL sumResult = false;
    int suma = 0;
    int tabSum[] = {1, 3, 7, 9, 1, 3, 7, 9, 1, 3};
    CString mDate = "";

    if(a_Pesel.GetLength() > 0)
    {
        for(int i = 0; i < 10; i++)
        {
            suma += tabSum[i] * stoi(a_Pesel[i]);
        }

        if ((suma % 10) == 0)
            sumResult = ((suma % 10) == stoi(a_Pesel[10]));
        else
            sumResult = ( (10 - (suma % 10)) == stoi(a_Pesel[10]));
    }

    if(sumResult){
        int year = 0;
        int month = 0;
        int day = stoi(a_Pesel.Mid(4,2));   

        if(a_Pesel[2] == '0' || a_Pesel[2] == '1')
        {
            year = 1900;
            month = stoi(a_Pesel[2]) * 10 + stoi(a_Pesel[3]);
        }else if (a_Pesel[2] == '2' || a_Pesel[2] == '3')
        {
            year = 2000;
            month = stoi(a_Pesel[2] - 20) * 10 + stoi(a_Pesel[3]);
        }else if (a_Pesel[2] == '4' || a_Pesel[2] == '5')
        {
            year = 2100;
            month = stoi(a_Pesel[2] - 40) * 10 + stoi(a_Pesel[3]);
        }else if (a_Pesel[2] == '6' || a_Pesel[2] == '7')
        {
            year = 2200;
            month = stoi(a_Pesel[2] - 60) * 10 + stoi(a_Pesel[3]);
        }else if (a_Pesel[2] == '8' || a_Pesel[2] == '9')
        {
            year = 1800;
            month = stoi(a_Pesel[2] - 80) * 10 + stoi(a_Pesel[3]);
        }

        year += stoi(a_Pesel[0]) * 10 + stoi(a_Pesel[1]);
        mDate = itos(year) + "-" + itos(month) + "-" + itos(day);
        COleDateTime tm;
        res=tm.ParseDateTime(mDate);

    }else{
        AfxMessageBox("Nieprawidłowy numer Pesel");
        return false;
    }

    return res;
}

Brak komentarzy:

Prześlij komentarz