piątek, 15 stycznia 2010

Generator i walidator numeru dowodu osobistego

Ostatnio potrzebowałem w pracy wprowadzić kilka danych testowych, ale aplikacja do wprowadzania tych danych wymagała m.in. wprowadzenia poprawnego numeru dowodu osobistego.
W dowodach osobistych cyfra kontrolna, to pierwsza cyfra w numerze dowodu (źródło), nie jak to się spodziewałem, że ostatnia.
Poniżej kod dwóch metod, do wygenerowania oraz do sprawdzenia numeru dowodu osobistego.

Zobacz jak to działa.

String generateDO(){
String seria="", numer="";
Random random = new Random(); 
int suma=0;
int waga[]={7,3,1,7,3};

for(int i=0;i<3;i++){
seria+=(char) (random.nextInt('Z'-'A')+'A');
suma+=waga[i]*(seria.charAt(i)-'A'+10);
}
for(int i=0;i<5;i++){
numer+=(char)(random.nextInt('9'-'0')+'0');
suma+=waga[i]*(numer.charAt(i)-'0');
}
return seria+suma%10+numer;
}


public boolean validate(String numerDO){
int waga[]={7,3,1,0,7,3,1,7,3};

 if(numerDO==null || numerDO.length()!=9)
 return false;
 int suma=0;
 for(int i=0;i<9;i++){
  if(Character.isLetter(numerDO.charAt(i)) && i<3){
 suma+=waga[i]*(numerDO.charAt(i)-'A'+10);
}else if(Character.isDigit(numerDO.charAt(i)) &&i>=3){
suma+=waga[i]*(numerDO.charAt(i)-'0');
}else return false;
}

if(((suma%10)+'0')==numerDO.charAt(3))
return true;
return false;
}

2 komentarze:

  1. może by skrócić trochę ten kod bo w pętli for takie wyrażenia jak -'A'+10 się dość mało zmieniają :-) i co więcej w kodach ASCII są stałe.

    Druga sprawa, że w literach serii nie używane są litera O (jak OLA) i litera Q (jak QUAD) - literki Q jestem mniej pewien.

    Trzecia sprawa to kolejność wydawania dowodów w danych seriach.
    Do tej pory - połowa roku 2010 - wydawane są dowody osobiste serii zaczynającej się od liter AS*.
    Sądząc po tempie wydawania nowych dowodów - obowiązek wymiany już był - teraz tylko ewentualne zagubione, zmienione i maturzyści - to seria A** się przez dwa lata nie skończy. Tak więc generator powinien nie generować - na razie przynajmniej - dowodów gdzie pierwszą literą jest litera inna niż A.

    Przy okazji; jeśli ktoś ma dane z seriami DO (numer nie konieczny żeby nie naruszać prawa o danych osobowych) i datami wydania to byłbym wdzięczny. zylla (at) wipos.p.lodz.pl

    OdpowiedzUsuń