Convertir de Romanos a Decimal y viceversa

Bueno les dejo una clase que realice hace unos dias para un reto de foros del web. Simplemente convierte un numero decimal en romano y tambien el proceso inverso. Esta realizada para enteros entre 0 y 3.99. La utilidad que le encuentro es para presentar fechas en romanos....

Su utilizacion es muy sencilla y la explico despues del codigo.

  1. <?php  
  2. /** 
  3.  * Clase NumerosRomanos. 
  4.  * Realiza conversiones entre numeros romanos y decimales. 
  5.  * Compatible con error_reporting(E_ALL | E_STRICT). 
  6.  * 
  7.  * @package     matematicas creado para forosdelweb. 
  8.  * @copyright   2010 - ObjetivoPHP 
  9.  * @license     Gratuito (Free) http://www.opensource.org/licenses/gpl-license.html 
  10.  * @author      Marcelo Castro (ObjetivoPHP) 
  11.  * @link        objetivophp@******.***.** 
  12.  * @version     0.2.1 (16/08/2010 - 18/08/2010) 
  13.  */  
  14. abstract class NumerosRomanos  
  15. {  
  16.     /** 
  17.      * Contiene las equivalencias de numeros romanos para unidades, decimales, 
  18.      * centenas y miles. 
  19.      * @var array 
  20.      */  
  21.     private static  $_romanos =     array(0   =>    array(0 => '',  
  22.                                                           1 => 'I',  
  23.                                                           2 => 'II',  
  24.                                                           3 => 'III',  
  25.                                                           4 => 'IV',  
  26.                                                           5 => 'V',  
  27.                                                           6 => 'VI',  
  28.                                                           7 => 'VII',  
  29.                                                           8 => 'VIII',  
  30.                                                           9 => 'IX'),  
  31.                                           1    =>   array(0 => '',  
  32.                                                           1 => 'X',  
  33.                                                           2 => 'XX',  
  34.                                                           3 => 'XXX',  
  35.                                                           4 => 'XL',  
  36.                                                           5 => 'L',  
  37.                                                           6 => 'LX',  
  38.                                                           7 => 'LXX',  
  39.                                                           8 => 'LXXX',  
  40.                                                           9 => 'XC'),  
  41.                                           2   =>    array(0 => '',  
  42.                                                           1 => 'C',  
  43.                                                           2 => 'CC',  
  44.                                                           3 => 'CCC',  
  45.                                                           4 => 'CD',  
  46.                                                           5 => 'D',  
  47.                                                           6 => 'DC',  
  48.                                                           7 => 'DCC',  
  49.                                                           8 => 'DCCC',  
  50.                                                           9 => 'CM'),  
  51.                                           3 =>      array(0 => '',  
  52.                                                           1 => 'M',  
  53.                                                           2 => 'MM',  
  54.                                                           3 => 'MMM'));  
  55.     /** 
  56.      * Contiene los divisores para identificar por donde comenzar la conversion. 
  57.      * @var array 
  58.      */  
  59.     private static $_divisores =    array(1, 10, 100, 1000);  
  60.     /** 
  61.      * Contiene las equivalencias entre romano y decimal. 
  62.      * @var array 
  63.      */  
  64.     private static $_decimal =      array('.'   => 0,  
  65.                                           'I'   => 1,  
  66.                                           'V'   => 5,  
  67.                                           'X'   => 10,  
  68.                                           'L'   => 50,  
  69.                                           'C'   => 100,  
  70.                                           'D'   => 500,  
  71.                                           'M'   => 1000);  
  72.     /** 
  73.      * Convierte un numero expresado en decimal a notacion Romana. 
  74.      * @param   integer $numero Numero que se desea convertir en romano. 
  75.      *                  desde 0 a 3999.- 
  76.      * @return  string 
  77.      */  
  78.     public static function decimalRomano($numero)  
  79.     {  
  80.         $retorno = '';  
  81.         $max = (int)log10($numero);  
  82.         for ($div = $max$div > -1; $div--) {  
  83.             $aux     =  (int)($numero/self::$_divisores[$div]);  
  84.                 $retorno.= self::$_romanos[$div][$aux];  
  85.                 $numero -=self::$_divisores[$div]*$aux;  
  86.         }  
  87.         return $retorno;  
  88.     }  
  89.     /** 
  90.      * Convierte un numero expresado en romanos a notacion decimal. 
  91.      * @param   string $romano  Numero de tipo romano Ej.DCCCLXXXVIII. 
  92.      * @return  integer 
  93.      */  
  94.     public static function romanoDecimal($romano)  
  95.     {  
  96.         $decimal    = 0;  
  97.         $letras     = strlen($romano);  
  98.         $romano    .= '.';  
  99.         for ($r = 0; $r < $letras$r++) {  
  100.             $valorI     = self::$_decimal[$romano[$r]];  
  101.             $valorII    = self::$_decimal[$romano[$r+1]];  
  102.             $decimal += ($valorI < $valorII)? - $valorI : $valorI;  
  103.         }  
  104.         return $decimal;  
  105.     }  
  106. }  

La utilizacion como dije arriba es sencilla.

1> incluimos el archivo.

2> llamamos a la funcion correspondiente.

  1. <?php  
  2. require_once 'NumerosRomanos.php';  
  3. // Convertimos un decimal a Romano  
  4. echo NumerosRomanos::decimalRomano(3999);  
  5. // Convertimos un Romano a Decimal  
  6. echo NumerosRomanos::romanoDecimal('MXXX');  

Saludos a todos...

Compártelo

También te puede interesar...

Comentarios

    No hay comentarios.

Escribe un comentario

Tienes que estar registrado para poder dejar comentarios.
Accede a tu cuenta o regístrate en NotasWeb.com.
Avatar_279 objetivophp
en el Ranking


Artículos más vistos del usuario

Últimos artículos del usuario