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!