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: 31409x | Kategorie: PHP Skripty | Napsal: peCan.cz |
Synek velitele koncentračního tábora si nechá na nádvoří u studny seřadit několik vězňů. Nakloní se nad studnu, chvíli do ní zírá a pak zavolá jednoho vězně: Postav se na kraj studny, předkloň se a natáhni levou ruku. Vězeň to udělá, klučina ho strčí a vězeň spadne do studny. Klučina se znovu nakloní nad studnu, chvíli do ni zírá a pak zavolá dalšího vězně: Postav se na kraj studny, pokrč se v kolenou a odtáhni pravou ruku od těla. Vězeň to udělá, klučina ho strčí a vězeň spadne do studny. Klučina se znovu nakloní nad studnu, chvíli do ní zírá a pak zavolá dalšího vězně: Postav se na kraj studny, stůj vzpřímeně a zvedni obě ruce. Vězeň to udělá, klučina ho strčí a vězeň spadne do studny.Takhle to dělá asi půl hodiny, než se otevře okno správní budovy. Z okna se vykloní jeho matka a volá: Osvalde, nech už toho tetrisu a pojď na oběd!
Petr Graubner | ICQ- 264912843, Jabber - pecan27@njs.netlab.cz | RSS | Šlape na miniRS | Styl CoolStyle | Zpracováno za: 0.121s | Počet SQL dotazů ve fóru: 1 | Admin