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

Jakub Vrána, Řešení problému, 30.11.2007, diskuse: 39 (nové: 0)

Diskuse

František Kocúrik:

Šikovná hračka, dík ;-)

Marek Javůrek:

Pekne, neco podobneho jsem psal ani ne pred tydnem... podobne.

ikona Jakub Vrána OpenID:

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?

DJ Miky:

MCMXCVI

Kristýna:

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

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?

megi:

MMVIII

Kamil:

Jak se píše prosím peosím 1989?

kosti:

MCMLXXXIX rek bych

Kamil:

děkují

viki:

ako sa pise 5896

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

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).

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 :-).

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.

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

d:

0 se nepise

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

anna:

ako sa píše 2005

Diskuse je zrušena z důvodu spamu.

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.