Římské číslice

Ří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.

Jakub Vrána, Řešení problému, 30.11.2007, on-line

Diskuse

František Kocúrik:

Šikovná hračka, dík ;-)
30.11.2007 10:46:33

Marek Javůrek:

Pekne, neco podobneho jsem psal ani ne pred tydnem... podobne.
30.11.2007 20:00:52

ikona 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 %=.
4.12.2007 19:03:14

gabinka:

odpovite mi nekdo co znamena MDCCLXIX
6.4.2008 22:39:45

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
10.4.2008 12:38:14

petr:

poradte mi prosim 2,4,6,9.prosííím :p
20.3.2010 11:08:28

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
4.8.2008 13:29:00

Jája:

ahojík prosím jak se píše rok 1996 ří,skými čislicemi?
3.9.2008 11:15:23

DJ Miky:

MCMXCVI
4.9.2008 09:39:06

Kristýna:

Dobrý den , poradíte mi prosím jak se píše římskými číslicemi 2008?
Děkuji za radu
5.9.2008 13:11:03

ikona v6ak:

Když jsem použil tento převodník, vypadlo MMVIII.

Koukám, že SEO může mít i vedlejší účinky: http://search.seznam.cz/searchScreen?q=%C5%…&sourceid=firefox . Pokud uživatel chce něco převést, není to pro něj nejlepší odkaz.

Nechceš sem tedy dát živou ukázku převodníku, abys zamezil těmto dotazům?
5.9.2008 15:43:01

megi:

MMVIII
16.12.2008 08:32:56

Kamil:

Jak se píše prosím peosím 1989?
19.10.2008 14:46:00

kosti:

MCMLXXXIX rek bych
21.10.2008 05:48:41

Kamil:

děkují
21.10.2008 09:46:45

viki:

ako sa pise 5896
1.11.2008 05:43:15

michal:

co je to IVIIIVI vym ze je to lehky ale ja to nvm
17.11.2008 03:55:18

ROZKA :

jAK SE PÍŠOU PROSÍM ŘÍMSKÁ ČÍSLICA OD 10TI DO 20TI AHOOJ
3.2.2009 12:13:53

ROZKA :

jAK SE PÍŠOU PROSÍM ŘÍMSKÁ ČÍSLICE
OD 10TI DO 20TI AHOOJ
3.2.2009 12:14:27

ikona 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).
5.2.2009 23:43:10

misa:

jak se pise prosim 17 14 18 19
8.2.2009 01:14:34

Kačí:

jak se prosím píše 1851 a 1930. Díky. :-)
9.2.2009 10:53:32

Jiří:

Jak se píše 1989??? ale potřebuju to vědět přesně... tím kratším stylem
17.3.2009 00:29:25

KAKA:

PROSÍM, CO ZNAMENA CISLO IIIVIIXIV
17.3.2009 10:37:41

vajvikisek:

Ahojky lidi nevíte jak se píše římsky 0-nula,teda pokud neco takovyho existuje :-).
5.4.2009 09:12:01

ikona 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.
5.4.2009 09:46:26

monika:

podrobneji by to chtelo
30.11.2009 16:37:46

polasekiu:

vubec tomu nerozumim
19.8.2010 14:33:17

Alena Hirkova:

ako sa pise prosim - 21.1.2008
15.9.2010 18:32:35

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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
8.10.2010 20:31:00

martin:

ahoj poradte prosim jak mam prevest zapis 1955
24.1.2011 13:48:52

cicusha:

ako sa napise po rimsky nula
4.10.2011 15:05:01

d:

0 se nepise
22.2.2012 18:51:20

Hanka:

jak se pise prosim rok 1982
1.3.2012 17:02:28

maruška:

ahojky kdyby někdochtěl pomocttak napište :D
6.3.2012 13:29:55

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;
}
?>
9.7.2013 10:55:58

kikinka:

Ahoj ta  římská čísla jsou fakt super mého bráchu to bezva naučilo
8.12.2014 13:47:42

Zdeněk:

A jak je to s desetinou čárkou?
Jak převést na římské číslice třeba 5,4
6.10.2016 20:34:56

anna:

ako sa píše 2005
10.7.2017 19:05:36
avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.