Convirtiendo Enteros a Números Escritos en C#
¿Alguna vez has necesitado convertir enteros a su forma escrita? Este es un requisito común en varias aplicaciones, como la generación de informes, la redacción de cheques o simplemente para hacer que los números sean más fáciles de leer en contenido textual. Por ejemplo, es posible que necesites convertir el número 21
a "Veintiuno"
.
Pero, ¿qué pasa si quieres una solución que no dependa de una gran tabla de referencia? En esta publicación del blog, exploraremos un método ordenado y eficiente en C# para convertir enteros en números escritos.
El Problema
Para convertir enteros a su forma escrita, muchos desarrolladores suelen recurrir a usar tablas de referencia grandes, las cuales pueden ser engorrosas y difíciles de mantener. En su lugar, exploraremos una solución más elegante utilizando manipulación de cadenas básica y recursión.
La Solución
Podemos lograr nuestro objetivo con una clase personalizada que utiliza arreglos para categorizar los números y una función recursiva para construir la forma escrita de manera incremental. Vamos a desglosarlo paso a paso.
La Clase HumanFriendlyInteger
La siguiente clase contiene el método para convertir enteros en sus equivalentes escritos:
public static class HumanFriendlyInteger
{
static string[] ones = new string[] { "", "Uno", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve" };
static string[] teens = new string[] { "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciséis", "Diecisiete", "Dieciocho", "Diecinueve" };
static string[] tens = new string[] { "Veinte", "Treinta", "Cuarenta", "Cincuenta", "Sesenta", "Setenta", "Ochenta", "Noventa" };
static string[] thousandsGroups = { "", " Mil", " Millón", " Mil millones" };
private static string FriendlyInteger(int n, string leftDigits, int thousands)
{
// Manejo de casos especiales según el valor del número
if (n == 0)
{
return leftDigits;
}
string friendlyInt = leftDigits;
if (friendlyInt.Length > 0)
{
friendlyInt += " ";
}
if (n < 10)
{
friendlyInt += ones[n];
}
else if (n < 20)
{
friendlyInt += teens[n - 10];
}
else if (n < 100)
{
friendlyInt += FriendlyInteger(n % 10, tens[n / 10 - 2], 0);
}
else if (n < 1000)
{
friendlyInt += FriendlyInteger(n % 100, (ones[n / 100] + " Cien"), 0);
}
else
{
friendlyInt += FriendlyInteger(n % 1000, FriendlyInteger(n / 1000, "", thousands + 1), 0);
if (n % 1000 == 0)
{
return friendlyInt;
}
}
return friendlyInt + thousandsGroups[thousands];
}
public static string IntegerToWritten(int n)
{
if (n == 0)
{
return "Cero";
}
else if (n < 0)
{
return "Negativo " + IntegerToWritten(-n);
}
return FriendlyInteger(n, "", 0);
}
}
Desglose del Código
-
Arreglos Estáticos: La clase utiliza cuatro arreglos estáticos para almacenar las formas escritas de los números:
ones
: Contiene las palabras para los números 1-9.teens
: Contiene las palabras para los números 10-19.tens
: Contiene las palabras para los múltiplos de diez (20, 30, etc.).thousandsGroups
: Contiene las palabras para valores mayores como mil, millón, etc.
-
Método FriendlyInteger: Este método recursivo descompone el número en partes manejables:
- Maneja los constructos de los números según sus tamaños (unidades, decenas, centenas y miles).
- Cada llamada construye recursivamente la representación de cadena verificando a qué categoría pertenece el número.
-
Método IntegerToWritten: Este es el método público para convertir enteros. Maneja cero y números negativos antes de llamar al método
FriendlyInteger
.
Conclusión
Al utilizar este método, puedes convertir eficientemente enteros a su forma escrita en C#. Esta solución no solo es elegante, sino que también evita el inconveniente de mantener amplias tablas de referencia.
La próxima vez que necesites mostrar números en texto, prueba este enfoque y disfruta de la salida limpia y amigable para el ser humano.