PHP - Convertir números romanos a arábigos con PHP

 
Vista:
sin imagen de perfil

Convertir números romanos a arábigos con PHP

Publicado por Pablo (5 intervenciones) el 10/01/2023 23:44:51
Hola he estado buscando en google varios días a esta solución y al final encontré esta class que me arroja un error y no se porque es: PHP Parse error: syntax error, unexpected 'abstract' (T_ABSTRACT) in /home/kwxnrefv/public_html/Numeros.php on line 14

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

Prueba.php

1
2
3
4
5
6
7
<?php
 
require_once('Numeros.php');
 
echo NumerosRomanos::romanoDecimal('MXXX');
 
?>

¿Alguien me puede ayudar?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Convertir números romanos a arábigos con PHP

Publicado por Kathyu (905 intervenciones) el 11/01/2023 17:14:41
Seguro es tu versión de PHP.

He probado ese código en la ultima versión de XAMPP con PHP +8 y todo funciona perfecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Convertir números romanos a arábigos con PHP

Publicado por Pablo (5 intervenciones) el 11/01/2023 17:29:43
No es la versión de PHP. Fíjate que la versión 8 es muy reciente y el código es del 2010, además he puesto la versión 5.1, 7.1 y la tuya y he reordenado el código de esta manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
abstract class NumerosRomanos {
 
     private static $_romanos =     array(0   =>    array(=> '',=> 'I',=> 'II',=> 'III',=> 'IV',=> 'V', 6 => 'VI', 7 => 'VII',=> 'VIII',=> 'IX'),
                                          1   =>    array(=> '',=> 'X',=> 'XX',=> 'XXX', 4 => 'XL', 5 => 'L',=> 'LX',=> 'LXX',=> 'LXXX',=> 'XC'),
                                          2   =>    array(=> '',=> 'C',=> 'CC',=> 'CCC', 4 => 'CD', 5 => 'D',=> 'DC',=> 'DCC',=> 'DCCC', 9 => 'CM'),
                                          3   =>    array(=> '',=> 'M',=> 'MM',=> '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;  
    }  
}
?>

y ahora me da este error: PHP Parse error: syntax error, unexpected '   ' (T_STRING), expecting ')' in /home/kwxnrefv/public_html/Numeros.php on line 4
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Convertir números romanos a arábigos con PHP

Publicado por Kathyu (905 intervenciones) el 11/01/2023 17:46:55
Entonces no se que pueda ser. Yo pruebo llamando la función en el mismo archivo y también con requiere y me funciona bien.

1
echo NumerosRomanos::romanoDecimal('XV');

Es super raro que a mi me funcione y a ti no, por eso automáticamente pensé en la versión de PHP.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Convertir números romanos a arábigos con PHP

Publicado por Pablo (5 intervenciones) el 11/01/2023 17:56:11
Tal vez me faltan activar extensiones de PHP que el código necesita ¿Cuales serían?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Convertir números romanos a arábigos con PHP

Publicado por Kathyu (905 intervenciones) el 11/01/2023 18:04:26
No hay extensiones de nada. Es código puro normal. En donde estas probándolo que no funciona?

Yo ya dije cual es mi ambiente, si tienes uno diferente tocara buscar el error y ver que dice la pagina de PHP.

Tocara que pruebes cualquiera de estas respuestas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Convertir números romanos a arábigos con PHP

Publicado por Pablo (5 intervenciones) el 11/01/2023 18:12:26
No funciona nada porque como bien dije el error que me arroja PHP es: PHP Parse error: syntax error, unexpected '   ' (T_STRING), expecting ')' in /home/kwxnrefv/public_html/Numeros.php on line 4 entonces deduzco que no reconoce los primeros array, según me dice después de conjunto vacío o antes tiene que cerrar los paréntesis () del array pero eso lo hace más abajo y no entiendo donde está mal, es que no itera el array.

Mi ambiente es Cloud Lynux y la v. de php es la 7.1

Ya estuve mirando en google el error y nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Convertir números romanos a arábigos con PHP

Publicado por Pablo (5 intervenciones) el 12/01/2023 23:22:16
Encontré este otro código que no es bidireccional pero hace lo que yo busco:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function romanoEntero($romano){
    $resultado = 0;
    $romanos = 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);
    foreach ($romanos as $llave => $valor) {
        while (strpos($romano, $llave) === 0) {
            $resultado += $valor;
            $romano     = substr($romano, strlen($llave));
        }
    }
    return $resultado;
}
 
echo "Lo que quiero: ".romanoEntero('LI')." en enteros.";
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar