PHP Classes

File: c-sharp/Num2Txt.cs

Recommend this page to a friend!
  Classes of Antonio Leiva  >  Num2Txt  >  c-sharp/Num2Txt.cs  >  Download  
File: c-sharp/Num2Txt.cs
Role: Auxiliary data
Content type: text/plain
Description: Auxiliary data
Class: Num2Txt
Convert a number to Spanish text
Author: By
Last change:
Date: 5 years ago
Size: 10,953 bytes
 

Contents

Class file image Download
using System;
using System.Text;

namespace Alp3476
{
    /// <summary>
    /// Transforma un valor numérico en su equivalente en texto.
    /// </summary>
    public static class A2Num2Txt
    {
        private static string[] textoCentenas = { "uno", "dos", "tres", "cuatro", "quinientos ", "seis", "sete", "ocho", "nove" };
        private static string[] textoDecenas = { "uno ", "veinti", "treinta ", "cuarenta ", "cincuenta ", "sesenta ", "setenta ", "ochenta ", "noventa " };
        private static string[] textoDiezVeinte = { "diez ", "once ", "doce ", "trece ", "catorce ", "quince ", "dieciseis ", "diecisiete ", "dieciocho ", "diecinueve " };
        private static string[] textoUnidades = { "uno ", "dos ", "tres ", "cuatro ", "cinco ", "seis ", "siete ", "ocho ", "nueve " };

        /// <summary>
        /// Convierte un número a letras.
        /// </summary>
        /// <param name="numero">Cadena de texto con los dígitos del número a procesar</param>
        /// <returns>Cadena de texto que representa al número</returns>
        public static string ToString(string numero)
        {
            double.TryParse(numero, out double valor);
            return A2Num2Txt.ToString(valor);
        }

        /// <summary>
        /// Convierte un número a letras.
        /// </summary>
        /// <param name="numero">Valor numérico que vamos a procesar</param>
        /// <returns>Cadena de texto que representa al número</returns>
        public static string ToString(double numero)
        {
            char c1 = '0', c2 = '0', c3 = '0', modo = ' ';
            int numeroTemporal = 0;
            int posicion, longitud;

            if (numero == 0.0)
            {
                return "cero";
            }
            if (numero > 999999999999.99)
            {
                return string.Empty;
            }

            StringBuilder sbTexto = new StringBuilder();
            bool esNegativo = numero < 0;
            if (esNegativo)
            {
                sbTexto.Append("menos ");
                numero = Math.Abs(numero);
            }

            string txtNumero = numero.ToString("0.00").PadLeft(15, '0');

            for (int contador = 1; contador < 6; contador++)
            {
                switch (contador)
                {
                    case 1: modo = 'm'; break;
                    case 2: modo = 'k'; break;
                    case 3: modo = 'm'; break;
                    case 4: modo = 'c'; break;
                    case 5: modo = 'u'; break;
                }

                string temp = string.Empty;

                if (contador < 5)
                {
                    posicion = (contador - 1) * 3;
                    if (posicion + 3 > txtNumero.Length)
                    {
                        longitud = txtNumero.Length - posicion;
                    }
                    else
                    {
                        longitud = 3;
                    }

                    temp = txtNumero.Substring((contador - 1) * 3, longitud);
                    if (longitud < 3)
                    {
                        temp = temp.PadRight(3, '0');
                    }

                    Convert.ToInt32(temp);
                    c1 = temp[0];
                    c2 = temp[1];
                    c3 = temp[2];
                    sbTexto.Append(Centenas(c1, c2, c3));
                    sbTexto.Append(Decenas(c2, c3));
                    sbTexto.Append(Unidades(c1, c2, c3, modo));
                }
                else
                {
                    temp = txtNumero.Substring(13, 2);
                    if (!String.IsNullOrEmpty(temp))
                    {
                        numeroTemporal = Convert.ToInt32(temp);
                        if (temp.Length < 2)
                        {
                            temp = temp.PadRight(2, '0');
                        }

                        c1 = '0';
                        c2 = temp[0];
                        c3 = temp[1];
                        sbTexto.Append(Decenas(c2, c3));
                        sbTexto.Append(Unidades(c1, c2, c3, modo));
                    }
                }

                if (String.IsNullOrEmpty(temp))
                {
                    continue;
                }

                numeroTemporal = Convert.ToInt32(temp);

                if (contador == 2 && (sbTexto.Length != 0 && !esNegativo || esNegativo && sbTexto.Length > 6))
                {
                    sbTexto.Append(c3 == '1' && c2 == '0' && c1 == '0' ? "millón " : "millones ");
                }


                if ((contador == 1 || contador == 3) && numeroTemporal > 0)
                {
                    sbTexto.Append("mil ");
                }

                if (contador == 4 && txtNumero.Length >= 13)
                {
                    if (!String.IsNullOrEmpty(txtNumero.Substring(13)) && Convert.ToInt32(txtNumero.Substring(13)) > 0)
                    {
                        if (txtNumero[9] == '0' && txtNumero[10] == '0' && txtNumero[11] == '1')
                        {
                            sbTexto.Append('o');
                        }
                        else if (sbTexto.Length == 0)
                        {
                            sbTexto.Append("cero ");
                        }

                        sbTexto.Append("con ");
                    }
                }
            }

            return sbTexto.ToString().Trim();
        }

        /// <summary>
        /// Devuelve una cadena con el texto correspondiente a las centenas, dentro de un grupo de 3 dígitos
        /// </summary>
        /// <param name="centenas">Dígito de las centenas</param>
        /// <param name="decenas">Dígito de las decenas</param>
        /// <param name="unidades">Dígito de las unidades</param>
        /// <returns>Cadena con el texto que corresponde al dígito de las centenas</returns>
        private static string Centenas(char centenas, char decenas, char unidades)
        {
            string txt = string.Empty;

            if (centenas == '0')
            {
                return txt;
            }

            if (centenas == '1')
            {
                if (decenas == '0' && unidades == '0')
                {
                    return "cien ";
                }
                else
                {
                    return "ciento ";
                }
            }

            for (char contador = '0'; contador <= '9'; contador++)
            {
                if (centenas == contador)
                {
                    int indice = (int)contador - (int)'1';
                    txt += textoCentenas[indice];
                    break;
                }
            }

            if (centenas != '5')
            {
                txt += "cientos ";
            }

            return txt;
        }

        /// <summary>
        /// Devuelve una cadena con el texto correspondiente a las decenas, dentro de un grupo de 2 dígitos
        /// </summary>
        /// <param name="decenas">Dígito de las decenas</param>
        /// <param name="unidades">Dígito de las unidades</param>
        /// <returns>Cadena con el texto que corresponde al dígito de las decenas</returns>
        private static string Decenas(char decenas, char unidades)
        {
            char contador;
            int indice;
            string txt = string.Empty;

            if (decenas == '0')
            {
                return (txt);
            }

            if (decenas == '1')
            {
                for (contador = '0'; contador <= '9'; contador++)
                {
                    if (unidades == contador)
                    {
                        indice = (int)contador - (int)'0';
                        txt = textoDiezVeinte[indice];
                        break;
                    }
                }

                return txt;
            }

            for (contador = '1'; contador <= '9'; contador++)
            {
                if (contador == decenas)
                {
                    break;
                }
            }

            if (contador > '9')
            {
                indice = 9;
            }
            else
            {
                indice = (int)contador - (int)'1';
            }

            if (unidades == '0')
            {
                if (decenas == '2')
                {
                    txt = "veinte ";
                }
                else
                {
                    txt = textoDecenas[indice];
                }

                return txt;
            }

            if (decenas != '2')
            {
                txt = textoDecenas[indice] + "y ";
            }
            else if (unidades != '0')
            {
                txt = textoDecenas[indice];
            }

            return txt;
        }

        /// <summary>
        /// Devuelve una cadena con el texto correspondiente a las centenas, dentro de un grupo de 3 dígitos
        /// </summary>
        /// <param name="centenas">Dígito de las centenas</param>
        /// <param name="decenas">Dígito de las decenas</param>
        /// <param name="unidades">Dígito de las unidades</param>
        /// <param name="modo">Indica la "posición" del bloque de dígitos dentro del número completo (si es el bloque de los miles, de las unidades, etc)</param>
        /// <returns>Cadena con el texto que corresponde al dígito de las unidades</returns>
        private static string Unidades(char centenas, char decenas, char unidades, char modo)
        {
            if (unidades == '0' || decenas == '1')
            {
                return string.Empty;
            }

            if (unidades == '1')
            {
                if (decenas == '0' && centenas == '0')
                {
                    if (modo == 'm')
                    {
                        return string.Empty;
                    }
                }

                if (modo == 'k')
                {
                    return "un ";
                }
            }

            int indice;
            char contador;

            for (contador = '1'; contador <= '9'; contador++)
            {
                if (contador == unidades)
                {
                    break;
                }
            }

            if (contador > '9')
            {
                indice = 9;
            }
            else
            {
                indice = (int)contador - (int)'1';
            }

            return textoUnidades[indice];
        }
    }
}
For more information send a message to info at phpclasses dot org.