Kontrola pravosti rodného čísla a výpočet věku

Nedávno jsem na JNW.com viděl dotaz na výpočet věku z rodného čísla. Docela mě to zaujalo, přišlo mě to jako pěkné cvičení na funkci substr. A nejen na ni.

Rodné číslo

Důležité je vědět, jak rodné číslo funguje. Mám tu takové shrnutí. Do roku 1954 bylo rodné číslo vždy 9ti místné. Od roku 1954 je 10ti místné a má pár důležitých vlastností.

  • 4 čísla za lomeno.
  • Je dělitelné 11 beze zbytku.
  • Dá se z něho poznat, zda jde o muže či ženu. Ženy mají u měsíce přičteno 50. Leden je u muže 01 a u ženy 51.

Vnímavější pochopili, že rodné číslo není věčné a asi se s ním do roku 2054 určitě budeme muset rozloučit a nahradí ho nějaký jiný identifikátor. V roce 2054 se totiž RČ začnou opakovat.
Takže tento skript bude co k čemu ani ne půl století:-D

rodne_cislo.php

<?php
/*
* Zkontroluje rodné číslo a spočítá věk
* (c) 2006 peCan.cz
*/
// Všimněte si, že RČ zadávám jako ŘETĚZEC, nikoliv ČÍSLO!!! (vypustila by se první nula)
$rc="5651152342";
//  $rc="8410274114";     // zadám RC, bez lomítka - RC narozen mezi 1954 a 2000
//  $rc="0212319393";     // zadám RC, bez lomítka - RC narozen po r.2000
// $rc="010101111";      // zadám RC, bez lomítka - RC narozen pred r.1954

$delka=strlen($rc); // Spočítám z kolika čísel se skládá.

function vek($birthdate){ // toto je jednoduchá funkce pro spočítání věku.
   $vek= intval((date("Ymd",mktime()) - $birthdate)/10000);
   return $vek." let";
}

if($delka==9){    //stary narozeny pred 1954

  $rok = substr($rc, 0, -7);    // vrátí 1-2 znak
  $mesic = substr($rc, 2, -5);  // vrátí 3-4 znak
  $den = substr($rc, 4, -3);    // vrátí 5-6 znak

  if($rok>=54){   // pokud je rok víc jak 54, je RC spatně, datum narození ale spočítat můžeme.
    echo "Rodné číslo není zadané správně";
  }

  if($mesic>=51 and $mesic<=62){ // pokud je mesic mezi 51 a 62 jedna se urcite o zenu (zase asi plati jen po roce 54, to nevim jiste, kontrolou to ale nepokazim).
    $mesic=$mesic-50;
    $zena=true;
    $n="Narozena: ";
  }else{
    $zena=false;
    $n="Narozen: ";
  }

  echo "<br/>";

  echo $n.$den.". ".$mesic.". 19".$rok. " - starý formát"; // Stoleti je 19.

  echo "<br/>";

  $m=strlen($mesic);
  if($m==1){
    $zeroM="0";
  }else{
    $zeroM="";
  }
  $d=strlen($den);
  if($d==1){
    $zeroD="0";
  }else{
    $zeroD="";
  }
  $DatNar="19".$rok.$zeroM.$mesic.$zeroD.$den;
  echo vek($DatNar);

}elseif($delka==10){ // mlady, narozen po 1953

  $check2=$rc / 11;   // pokud je RC 10 místné, musí být dělitelné 11 beze zbytku
  $check=floor($check2);  // zaokrouhlím  vždy dolů.

  if($check == $check2){  // Kontrola pravosti RC
    echo "Rodné číslo je zadané správně";
  }else{
    echo "Rodné číslo není zadané správně";
  }

  $rok = substr($rc, 0, -8);    // vrátí 1-2 znak
  $mesic = substr($rc, 2, -6);  // vrátí 3-4 znak
  $den = substr($rc, 4, -4);    // vrátí 5-6 znak

  if($mesic>=51 and $mesic<=62){  // pokud je mesic mezi 51 a 62 jedna se urcite o zenu (zase asi plati jen po roce 53, to nevim jiste).
    $mesic=$mesic-50;
    $zena=true;
    $n="Narozena: ";
  }else{
    $zena=false;
    $n="Narozen: ";
  }

  $letos=date("y");

  if($letos>=$rok){
    $stoleti=20;
  }else{
    $stoleti=19;
  }

  echo "<br/>";

  // Vypíšeme kdy se narodil
  echo $n.$den.". ".$mesic.". ".$stoleti.$rok." - Nový formát";

  echo "<br/>";

  // Spočítámě věk
  $m=strlen($mesic);
  if($m==1){
    $zeroM="0";
  }else{
    $zeroM="";
  }
  $d=strlen($den);
  if($d==1){
    $zeroD="0";
  }else{
    $zeroD="";
  }
  $DatNar=$stoleti.$rok.$zeroM.$mesic.$zeroD.$den;
  echo vek($DatNar);
}else{
  echo "Toto rozhodně rodné číslo není";
}
?>

Tak, je to napsané, doufám, že tam není nějaká chybka v úvaze;-).

Heh, tak už jsme našli 2:-)

Na skript se můžete podívat v akci nebo si ho stáhnout


<Starší | tento článek | Novější>

Napsáno: 30. 8. 2006, 13:42 | Přečteno: 31249x | Kategorie: PHP Skripty | Napsal: peCan.cz |
Sadistická rodinka jede na nedělní výlet autem... Vyjedou, ujedou 2 kilometry, do cesty jim vběhne zajíc, tatínek šlápne na plyn a přejede ho. Všichni v aute radostně výskají, jak se mu to povedlo. Jedou dál. 50. kilometr. Do cesty vběhne srna, tatínek zrychlí a je na maděru. Všichni se opět radostně smějí, děti tleskají. 80 kilometr. Předjíždějí náklaďák naložený ocelovýma plátama, vtom jedna deska spadne na auto, rozpulí ho a tatínkovi uřeže hlavu. Všichni se smějí, jen nejmenší pláče. Proč brečíš, ptá se ho maminka. Když já to neviděl...
Petr Graubner | ICQ- 264912843, Jabber - pecan27@njs.netlab.cz | RSS | Šlape na miniRS | Styl CoolStyle | Zpracováno za: 0.142s | Počet SQL dotazů ve fóru: 1 | Admin