Convertendo Inteiros em Números por Extenso em C#
Você já se viu na necessidade de converter inteiros em sua forma escrita? Essa é uma exigência comum em várias aplicações, como gerar relatórios, escrever cheques ou simplesmente tornar os números mais fáceis de ler em um conteúdo textual. Por exemplo, você pode precisar converter o número 21
em "Vinte e Um"
.
Mas e se você quiser uma solução que não dependa de uma enorme tabela de busca? Neste post do blog, vamos explorar um método limpo e eficiente em C# para converter inteiros em números por extenso.
O Problema
Para converter inteiros em forma escrita, muitos desenvolvedores costumam recorrer a tabelas de busca grandes, o que pode ser trabalhoso e difícil de manter. Em vez disso, vamos explorar uma solução mais elegante usando manipulação básica de strings e recursão.
A Solução
Podemos atingir nosso objetivo com uma classe personalizada que usa arrays para categorizar números e uma função recursiva para construir a forma escrita incrementamente. Vamos descrever passo a passo.
A Classe HumanFriendlyInteger
A classe abaixo contém o método para converter inteiros em seus equivalentes escritos:
public static class HumanFriendlyInteger
{
static string[] ones = new string[] { "", "Um", "Dois", "Três", "Quatro", "Cinco", "Seis", "Sete", "Oito", "Nove" };
static string[] teens = new string[] { "Dez", "Onze", "Doze", "Treze", "Catorze", "Quinze", "Dezesseis", "Dezessete", "Dezoito", "Dezenove" };
static string[] tens = new string[] { "Vinte", "Trinta", "Quarenta", "Cinquenta", "Sessenta", "Setenta", "Oitenta", "Noventa" };
static string[] thousandsGroups = { "", " Mil", " Milhão", " Bilhão" };
private static string FriendlyInteger(int n, string leftDigits, int thousands)
{
// Tratando casos especiais com base no valor do 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] + " Cento"), 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 "Zero";
}
else if (n < 0)
{
return "Negativo " + IntegerToWritten(-n);
}
return FriendlyInteger(n, "", 0);
}
}
Análise do Código
-
Arrays Estáticos: A classe usa quatro arrays estáticos para armazenar as formas escritas dos números:
ones
: Contém palavras para os números de 1 a 9.teens
: Contém palavras para os números de 10 a 19.tens
: Contém palavras para os múltiplos de dez (20, 30, etc.).thousandsGroups
: Contém palavras para valores superiores como mil, milhão, etc.
-
Método FriendlyInteger: Este método recursivo divide o número em partes gerenciáveis:
- Ele trata as construções dos números com base em seus tamanhos (unidades, dezenas, centenas e milhares).
- Cada chamada constrói recursivamente a representação em string verificando em qual categoria o número se encaixa.
-
Método IntegerToWritten: Este é o método público para converter inteiros. Ele trata os números zero e negativos antes de chamar o método
FriendlyInteger
.
Conclusão
Usando este método, você pode converter eficientemente inteiros em sua forma escrita em C#. Esta solução não é apenas elegante, mas também evita o trabalho de manter vastas tabelas de busca.
Na próxima vez que você precisar exibir números em texto, experimente esta abordagem e aproveite a saída limpa e amigável para o usuário!