Colabora
   

Números arábigos a romanos

 

Fecha: 29/Dic/2007 (28-12-07)
Autor: Ehitel Rodríguez Castro - [email protected]

 

Números arábigos a romanos es una clase de C# para convertir números arábigos (normales) a números romanos, aceptando valores desde 1 hasta 99.999.


Introducción

Saludos, espero que todos gocen de buena salud.


Buscando en internet una función para convertir números naturales a números romanos encontré una, pero realmente vi que podía mejorarse de forma significativa, pero la verdad preferí escribir mi propia rutina, no les niego que el código que vi me dio buenas ideas.

La clase que les adjunto traduce números en un rango de 1 a 99,999 (un número bastante alto creo) para lo cual usa una matriz que contiene un conjunto de números romanos que serán combinados en el proceso para obtener el resultado.

Espero que sea de utilidad para alguien, y si no, al menos ahí va mi primera colaboración después de tanto tiempo de usar los recursos del sitio. (Así el Guille no me regaña cada vez que hago un download, son bromas, realmente espero que alguien le pueda dar uso).

 

Contenido

Esta clase no tiene nada espectacular, como podrás observar, se trata tan sólo de una matriz que contiene ciertos números romanos representativos, y que durante el proceso de "traducción" se combinan para obtener el resultado final. Hasta el momento sólo analiza enteros de cinco cifras (cómo les decía sólo trabaja en un rango de 1 a 99999).

El proceso inicia analizando la cifra natural de izquierda a derecha y el resultado obtenido de cada digito natural lo traduce a su análogo en numeración romana y lo concatena al resultado del digito anteriormente analizado, hasta finalizar con el último digito de la derecha de la cifra completa. (jeje, que enredo)

Por ejemplo: 1005

1 = M (al ser una cifra de cuatro digitos, el primer número a la izquierda representa miles y el número mil se representa con una M en la numeración romana).

0 = No tiene representación

0 = No tiene representación

5 = V (Al ser el último digito de la cifra éste obviamente es unidades y cinco se representa con V)

El resultado de 1005 traducido a números romanos sería MV.

 

Jeje, disculpen si no explico muy bien. Pero basta con copiar el código y pegarlo, para que lo veas en acción.

 

Nota:

Tenga en cuenta que los carácteres encerrados entre paréntesis son números multiplicados por mil. Por ejemplo (V) representa 5,000.

 

El código:

Después de tanto enredo aquí les va el código de la clase...

  public class naturalRomanos
    {
        #region Atributos
        private string[] _romanos = new string[50];

        #endregion
        #region Contructores
        public naturalRomanos()
        {
            InicializarMatriz();
        } 
        #endregion
        #region Métodos públicos
        public string Convertir(int pNumero)
        {
            string _letras = "";

            switch (pNumero.ToString().Length)
            {
                case 1:
                    _letras += ConvierteUno(pNumero.ToString());
                    break;
                case 2:
                    _letras += ConvierteDos(pNumero.ToString());
                    break;
                case 3:
                    _letras += ConvierteTres(pNumero.ToString());
                    break;
                case 4:
                    _letras += ConvierteCuatro(pNumero.ToString());
                    break;
                case 5:
                    _letras += ConvierteCinco(pNumero.ToString());
                    break;
            }

            return _letras;
        }
        #endregion
        #region Métodos privados
        private string ConvierteUno(string pNumero)
        {
            return _romanos[int.Parse(pNumero)];
        }

        private string ConvierteDos(string pNumero)
        {
            //Obtiene el primer número
            string _letras = "";
            string _numero = pNumero.ToString().Substring(0, 1);
            string _temp = "";

            if (int.Parse(_numero) > 0)
            {
                _letras = _romanos[int.Parse(_numero) + 9];
            }
            _temp = ConvierteUno(pNumero.ToString().Substring(1, 1));

            return _letras + _temp;
        }

        private string ConvierteTres(string pNumero)
        {
            string _letras = "";
            string _temp = "";

            if (int.Parse(pNumero.ToString().Substring(0, 1)) > 0)
            {
                _letras += _romanos[int.Parse(pNumero.ToString().Substring(0, 1)) + 18];
            }

            _temp = ConvierteDos(pNumero.ToString().Substring(1, 2));

            return _letras + _temp;
        }

        private string ConvierteCuatro(string pNumero)
        {
            string _letras = "";
            string _temp = "";

            if (int.Parse(pNumero.ToString().Substring(0, 1)) > 0)
            {
                _letras += _romanos[int.Parse(pNumero.ToString().Substring(0, 1)) + 27];
            }
            _temp += ConvierteTres(pNumero.Substring(1, 3));

            return _letras + _temp;
        }

        private string ConvierteCinco(string pNumero)
        {
            string _letras = "";
            string _temp = "";

            _letras += _romanos[int.Parse(pNumero.ToString().Substring(0, 1)) + 36];
            _temp += ConvierteCuatro(pNumero.Substring(1, 4));

            return _letras + _temp;
        }

        private void InicializarMatriz()
        {
            //Ahora con los números _romanoss
            _romanos[0] = "";
            _romanos[1] = "I";
            _romanos[2] = "II";
            _romanos[3] = "III";
            _romanos[4] = "IV";
            _romanos[5] = "V";
            _romanos[6] = "VI";
            _romanos[7] = "VII";
            _romanos[8] = "VIII";
            _romanos[9] = "IX";
            _romanos[10] = "X";
            _romanos[11] = "XX";
            _romanos[12] = "XXX";
            _romanos[13] = "XL";
            _romanos[14] = "L";
            _romanos[15] = "LX";
            _romanos[16] = "LXX";
            _romanos[17] = "LXXX";
            _romanos[18] = "XC";
            _romanos[19] = "C";
            _romanos[20] = "CC";
            _romanos[21] = "CCC";
            _romanos[22] = "CD";
            _romanos[23] = "D";
            _romanos[24] = "DC";
            _romanos[25] = "DCC";
            _romanos[26] = "DCCC";
            _romanos[27] = "CM";
            _romanos[28] = "M";
            _romanos[29] = "MM";
            _romanos[30] = "MMM";
            _romanos[31] = "M(V)";
            _romanos[32] = "(V)";
            _romanos[33] = "(V)M";
            _romanos[34] = "(V)MM";
            _romanos[35] = "(V)MMM";
            _romanos[36] = "M(X)";
            _romanos[37] = "(X)";
            _romanos[38] = "(XX)";
            _romanos[39] = "(XXX)";
            _romanos[40] = "(XL)";
            _romanos[41] = "(L)";
            _romanos[42] = "(LX)";
            _romanos[43] = "(LXX)";
            _romanos[44] = "(LXXX)";
            _romanos[45] = "(XC)";

        } 
        #endregion
    }

 

Espero le sea de provecho.

 


Espacios de nombres usados en el código de este artículo:

System
System.Collections.Generic
System.Text

 



Compromiso del autor del artículo con el sitio del Guille:

Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:

El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.

En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.

Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:

Gracias.



Ir al índice principal de el Guille