Vzorové skripty v PHP a JS pro kontrolu správnosti formátu čísel.
Ověření rodného čísla
- spočti zbytek po dělení prvních devíti číslic a čísla 11
- je-li zbytek 10, musí být poslední číslice 0
- jinak poslední číslice musí být rovna zbytku
Tedy 780123/3540 je korektní rodné číslo, ačkoliv není dělitelné jedenácti.
Implementace v PHP:
function verifyRC($rc)
{
// "be liberal in what you receive"
if (!preg_match('#^s*(dd)(dd)(dd)[ /]*(ddd)(d?)s*$#', $rc, $matches)) {
return FALSE;
}
list(, $year, $month, $day, $ext, $c) = $matches;
// do roku 1954 přidělovaná devítimístná RČ nelze ověřit
if ($c === '') {
return $year < 54;
}
// kontrolní číslice
$mod = ($year . $month . $day . $ext) % 11;
if ($mod === 10) $mod = 0;
if ($mod !== (int) $c) {
return FALSE;
}
// kontrola data
$year += $year < 54 ? 2000 : 1900;
// k měsíci může být připočteno 20, 50 nebo 70
if ($month > 70 && $year > 2003) $month -= 70;
elseif ($month > 50) $month -= 50;
elseif ($month > 20 && $year > 2003) $month -= 20;
if (!checkdate($month, $day, $year)) {
return FALSE;
}
// cislo je OK
return TRUE;
}
Rodné číslo – JavaScript:
function testRC(x, age)
{
if(!age) age = 0;
try
{
if(x.length == 0) return true;
if(x.length < 9) throw 1;
var year = parseInt(x.substr(0, 2), 10);
var month = parseInt(x.substr(2, 2), 10);
var day = parseInt( x.substr(4, 2), 10);
var ext = parseInt(x.substr(6, 3), 10);
if((x.length == 9) && (year < 54)) return true;
var c = 0;
if(x.length == 10) c = parseInt(x.substr(9, 1));
var m = parseInt( x.substr(0, 9)) % 11;
if(m == 10) m = 0;
if(m != c) throw 1;
year += (year < 54) ? 2000 : 1900;
if((month > 70) && (year > 2003)) month -= 70;
else if (month > 50) month -= 50;
else if ((month > 20) && (year > 2003)) month -= 20;
var d = new Date();
if((year + age) > d.getFullYear()) throw 1;
if(month == 0) throw 1;
if(month > 12) throw 1;
if(day == 0) throw 1;
if(day > 31) throw 1;
}
catch(e)
{
alert('Zadaný údaj není korektní!');
return false;
}
return true;
}
Ověření IČ
Takže, jak se ověřuje IČ? Například 69663963
- první až sedmou číslici vynásobíme čísly 8, 7, 6, 5, 4, 3, 2 a součiny sečteme:
soucet = 6*8 + 9*7 + 6*6 + 6*5 + 3*4 + 9*3 + 6*2 = 228
- spočítáme zbytek po dělení jedenácti:
zbytek = soucet % 11
- pro poslední osmou číslici c musí platit:
- je-li zbytek 0 nebo 10, pak
c = 1
- je-li zbytek 1, pak
c = 0
- v ostatních případech je
c = 11 - zbytek
- je-li zbytek 0 nebo 10, pak
Implementace v PHP:
function verifyIC($ic)
{
// "be liberal in what you receive"
$ic = preg_replace('#s+#', '', $ic);
// má požadovaný tvar?
if (!preg_match('#^d{8}$#', $ic)) {
return FALSE;
}
// kontrolní součet
$a = 0;
for ($i = 0; $i < 7; $i++) {
$a += $ic[$i] * (8 - $i);
}
$a = $a % 11;
if ($a === 0) $c = 1;
elseif ($a === 10) $c = 1;
elseif ($a === 1) $c = 0;
else $c = 11 - $a;
return (int) $ic[7] === $c;
}
IČ – JavaScript:
function testICO(x)
{
try
{
var a = 0;
if(x.length == 0) return true;
if(x.length != 8) throw 1;
var b = x.split('');
var c = 0;
for(var i = 0; i < 7; i++) a += (parseInt(b[i]) * (8 - i));
a = a % 11;
c = 11 - a;
if(a == 1) c = 0;
if(a == 0) c = 1;
if(a == 10) c = 1;
if(parseInt(b[ 7]) != c) throw(1);
}
catch(e)
{
alert('Zadaný údaj není korektní!');
return false;
}
return true;
}