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: 6 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]; } } }