Římské číslice
Školení, která pořádám
Římské číslice se dají použít tam, kde se nám nehodí přímočarost těch arabských. Vzhledem k tomu, že se poměrně těžko čtou, tak také obvykle nepředpokládáme, že by číslo čtenáře až tolik zajímalo. Používají se třeba u roku výroby filmu a až donedávna jimi byly číslované i kapitoly v PHP manuálu.
Pokud potřebujeme římské číslice použít v číslovaném seznamu na HTML stránce, stačí použít vlastnost list-style-type: upper-roman
nebo HTML atribut <ol type="I">
. Pro přímý převod na římské číslice v PHP kupodivu není funkce, snadno si ji ale můžeme vytvořit:
<?php
class RimskeCislice {
static private $cislice = array(
"M" => 1000, "CM" => 900,
"D" => 500, "CD" => 400,
"C" => 100, "XC" => 90,
"L" => 50, "XL" => 40,
"X" => 10, "IX" => 9,
"V" => 5, "IV" => 4,
"I" => 1
);
/** Převod čísla na římské číslice
* @param int $cislo číslo k převodu
* @return string číslo zapsané řeckými číslicemi
* @copyright Jakub Vrána, https://php.vrana.cz/
*/
static function rimske($cislo) {
$return = "";
foreach (self::$cislice as $key => $val) {
$return .= str_repeat($key, floor($cislo / $val));
$cislo %= $val;
}
return $return;
}
/** Převod čísla zapsaného římskými číslicemi
* @param string $rimske číslo k převodu
* @return int hodnota čísla
* @copyright Jakub Vrána, https://php.vrana.cz/
*/
static function cislo($rimske) {
$return = 0;
for ($i=0; $i < strlen($rimske); $i++) {
$x = self::$cislice[$rimske[$i]];
if ($i+1 < strlen($rimske) && ($dalsi = self::$cislice[$rimske[$i+1]]) > $x) {
$return += $dalsi - $x;
$i++;
} else {
$return += $x;
}
}
return $return;
}
}
echo RimskeCislice::rimske(1968) . "\n"; // MCMLXVIII
echo RimskeCislice::cislo("MCMLXVIII") . "\n"; // 1968
?>
Třída obsahuje jak funkci pro převod na římské číslice, tak nazpět. Podle pravidel používání římských číslic je možnost odčítání omezena na 6 možností, proto jsou tyto možnosti přímo vyjmenované v poli $cislice
. Při převodu z římských číslic se naopak toleruje i nesprávný zápis IM
nebo VC
.
Viz také novější článek na stejné téma.
Diskuse
Marek Javůrek:
Pekne, neco podobneho jsem psal ani ne pred tydnem... podobne.
Jakub Vrána :
Upozorňuji na to, že algoritmus funkce rimske() se postupně vyvíjel.
První iterace vypadala nějak takhle:
<?php
while ($cislo >= 1)
foreach ($cislice as $key => $val)
if ($cislo >= $val) {
$return .= $key;
$cislo -= $val;
}
?>
V druhé iteraci mě napadlo cykly obrátit a tím snížit časovou složitost:
<?php
foreach ($cislice as $val)
while ($cislo >= $val) {
$return .= $key;
$cislo -= $val
}
?>
Třetí iterace už je jenom záměna vnitřního cyklu za str_repeat() a operátor %=.
gabinka:
odpovite mi nekdo co znamena MDCCLXIX
ich:
vidíš nahoře v článku jak je to pole s přiřazením písmenek k číslům...? tak podle toho to přečteš. Jinak M+D+C+C L+X I-X
petr:
poradte mi prosim 2,4,6,9.prosííím :p
dfkjdlkf:
hejky tak to je teda husty sem to nak nemohla najit a ani se mi to nedarilo nejak zapamatovat takze ste mi fakt docela pomohli no jinak mate docela pekny stranky sem vam je chtela pochvalit nebo chtel pochvalit???vlastne uz ani nevim jestli sem holka nebo kluk...oblikam se jako holka i kluk chovam se jako holka i kluk jenom sem asi spis na kluky nez na holky...ty sou vsechny na jedno brdo
Jája:
ahojík prosím jak se píše rok 1996 ří,skými čislicemi?
Kristýna:
Dobrý den , poradíte mi prosím jak se píše římskými číslicemi 2008?
Děkuji za radu
Kamil:
Jak se píše prosím peosím 1989?
kosti:
MCMLXXXIX rek bych
michal:
co je to IVIIIVI vym ze je to lehky ale ja to nvm
ROZKA :
jAK SE PÍŠOU PROSÍM ŘÍMSKÁ ČÍSLICA OD 10TI DO 20TI AHOOJ
ROZKA :
jAK SE PÍŠOU PROSÍM ŘÍMSKÁ ČÍSLICE
OD 10TI DO 20TI AHOOJ
v6ak:
Teď jsem se naštval. Toto není diskuze pro ty, kdo chtějí převádět čísla.
Takže: pokuc chcete něco PŘEVÁĎĚT, nemusíte tu otravovat v diskuzi (která je o něčem jiném), ale použijte nějaký konverter, třeba http://krizovky.svada.cz/rimsky.php (nebo UTFSE).
misa:
jak se pise prosim 17 14 18 19
Kačí:
jak se prosím píše 1851 a 1930. Díky. :-)
Jiří:
Jak se píše 1989??? ale potřebuju to vědět přesně... tím kratším stylem
KAKA:
PROSÍM, CO ZNAMENA CISLO IIIVIIXIV
vajvikisek:
Ahojky lidi nevíte jak se píše římsky 0-nula,teda pokud neco takovyho existuje :-).
v6ak:
Záporná čísla ani nulu neměli.
Jakube, nechce se ti udělat ta názoromu ukázku nebo link třeba na http://krizovky.svada.cz/rimsky.php ?
Omlouvám se, že křičím, ale: POKUD CHCETE NĚKDO NĚCO PŘEVÉST, BĚŽTE TŘEBA NA http://krizovky.svada.cz/rimsky.php .
STRÁNKA, NA KTERÉ PRÁVĚ JSTE, NENÍ PRO NORMÁLNÍ LIDI. TA JE URČENA NÁM, PROGRAMÁTORŮM, TAKOVÝM ZVLÁŠTNÍM LIDEM, KTEŘÍ SI NELIBUJÍ ANITAK V POUŽÍVÁNÍ NĚČEHO, ALE VE VYTVÁŘENÍ. VY TOMU NEMUSÍTE ROZUMĚT.
monika:
podrobneji by to chtelo
polasekiu:
vubec tomu nerozumim
Alena Hirkova:
ako sa pise prosim - 21.1.2008
normal lid:
Tak naco ta stránka tadi je kdiš je jenom pro programátory a tak co maj dělat ty normální lidi jo promin že křičim!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
martin:
ahoj poradte prosim jak mam prevest zapis 1955
cicusha:
ako sa napise po rimsky nula
Hanka:
jak se pise prosim rok 1982
maruška:
ahojky kdyby někdochtěl pomocttak napište :D
jpsk:
Ahoj, skvělá věc a funguje :). Moc díky! Chtěl jsem to jen jako fci, ne jako třídu, tak jsem to malinko upravil:
<?php
function KonverzeRimske2Arabske($cislo)
{
if(!is_int($cislo))
{
$rimske = $cislo;
$cislo = 0;
}
$cislice = array('M' => 1000,'CM' => 900,'D' => 500,'CD' => 400,'C' => 100,'XC' => 90,'L' => 50,'XL' => 40,'X' => 10,'IX' => 9,'V' => 5,'IV' => 4,'I' => 1);
$return = '';
if($cislo)
{
foreach ($cislice as $key => $val)
{
$return .= str_repeat($key, floor($cislo / $val));
$cislo %= $val;
}
}
else
{
for ($i=0; $i < strlen($rimske); $i++)
{
$x = $cislice[$rimske[$i]];
if(($i + 1 < strlen($rimske)) && (($dalsi = $cislice[$rimske[($i+1)]]) > $x))
{
$return += $dalsi - $x;
$i++;
}
else $return += $x;
}
}
return $return;
}
?>
kikinka:
Ahoj ta římská čísla jsou fakt super mého bráchu to bezva naučilo
Zdeněk:
A jak je to s desetinou čárkou?
Jak převést na římské číslice třeba 5,4
Diskuse je zrušena z důvodu spamu.