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.
- <?php
-
-
-
-
-
-
-
-
-
-
-
-
- abstract class NumerosRomanos
- {
-
-
-
-
-
- private static $_romanos = array(0 => array(0 => '',
- 1 => 'I',
- 2 => 'II',
- 3 => 'III',
- 4 => 'IV',
- 5 => 'V',
- 6 => 'VI',
- 7 => 'VII',
- 8 => 'VIII',
- 9 => 'IX'),
- 1 => array(0 => '',
- 1 => 'X',
- 2 => 'XX',
- 3 => 'XXX',
- 4 => 'XL',
- 5 => 'L',
- 6 => 'LX',
- 7 => 'LXX',
- 8 => 'LXXX',
- 9 => 'XC'),
- 2 => array(0 => '',
- 1 => 'C',
- 2 => 'CC',
- 3 => 'CCC',
- 4 => 'CD',
- 5 => 'D',
- 6 => 'DC',
- 7 => 'DCC',
- 8 => 'DCCC',
- 9 => 'CM'),
- 3 => array(0 => '',
- 1 => 'M',
- 2 => 'MM',
- 3 => 'MMM'));
-
-
-
-
- private static $_divisores = array(1, 10, 100, 1000);
-
-
-
-
- private static $_decimal = array('.' => 0,
- 'I' => 1,
- 'V' => 5,
- 'X' => 10,
- 'L' => 50,
- 'C' => 100,
- 'D' => 500,
- 'M' => 1000);
-
-
-
-
-
-
- public static function decimalRomano($numero)
- {
- $retorno = '';
- $max = (int)log10($numero);
- for ($div = $max; $div > -1; $div--) {
- $aux = (int)($numero/self::$_divisores[$div]);
- $retorno.= self::$_romanos[$div][$aux];
- $numero -=self::$_divisores[$div]*$aux;
- }
- return $retorno;
- }
-
-
-
-
-
- public static function romanoDecimal($romano)
- {
- $decimal = 0;
- $letras = strlen($romano);
- $romano .= '.';
- for ($r = 0; $r < $letras; $r++) {
- $valorI = self::$_decimal[$romano[$r]];
- $valorII = self::$_decimal[$romano[$r+1]];
- $decimal += ($valorI < $valorII)? - $valorI : $valorI;
- }
- return $decimal;
- }
- }
La utilizacion como dije arriba es sencilla.
1> incluimos el archivo.
2> llamamos a la funcion correspondiente.
- <?php
- require_once 'NumerosRomanos.php';
-
- echo NumerosRomanos::decimalRomano(3999);
-
- echo NumerosRomanos::romanoDecimal('MXXX');
Saludos a todos...
No hay comentarios.