goncin@wordpress.com:~$ _

Linux, programação e toda sorte de nerdices

Números por extenso agora também em Ruby!

Há alguns meses, publiquei no GitHub uma classe PHP chamada GExtenso, que gera o extenso de números e moedas. O feedback foi bastante positivo: o pessoal começou a usar a minha classe como plugin para o CodeIgniter.

Desde o início, sempre tive a intenção de implementar o GExtenso em outras linguagens. Eu vinha estudando Ruby meio de brincadeira, mas para deixar a coisa mais séria resolvi que a primeira tradução seria para ela.

Tal qual a implementação original, em PHP, a versão em Ruby utilizou:

  • métodos estáticos, implementando o padrão de projeto (design pattern) SINGLETON;
  • chamadas recursivas a métodos, minimizando repetições e mantendo o código enxuto; e
  • tratamento de erros por intermédio de exceções.

ATENÇÃO: Este é o meu primeiro trabalho na linguagem Ruby. A lógica foi originalmente desenvolvida em PHP; portanto, o estilo do código pode não agradar programadores Ruby experientes. Estou aberto a críticas construtivas e sugestões, para melhorar meu conhecimento na linguagem.

Exemplos de uso

Para obter o extenso de um número, utilize GExtenso.numero.

require 'GExtenso.rb'

puts GExtenso.numero(832); # oitocentos e trinta e dois
puts GExtenso.numero(832, GExtenso::GENERO_FEM) # oitocentas e trinta e duas

Para obter o extenso de um valor monetário, utilize GExtenso.moeda.

require 'GExtenso.rb'

# IMPORTANTE: veja nota sobre o parâmetro 'valor' na documentação do método!
puts GExtenso.moeda(15402) # cento e cinquenta e quatro reais e dois centavos
puts GExtenso.moeda(47)   # quarenta e sete centavos
puts GExtenso.moeda(357082, 2, ['peseta', 'pesetas', GExtenso::GENERO_FEM], ['cêntimo', 'cêntimos', GExtenso::GENERO_MASC])
# três mil, quinhentas e setenta pesetas e oitenta e dois cêntimos

Download via github: http://github.com/goncin/GExtenso

Anúncios

3 Respostas para “Números por extenso agora também em Ruby!

  1. Renato Elias 12/06/2010 às 19\0724

    Apenas para avisar que existe uma gem chamado brazilian-rails que tem vários subprojetos para internacionalizar o rails/ruby e uma das gems cuida de números e faz isto nos números como mixin ficando muito elegante.

    112.50.to_extenso

    e já geraa
    cento e doze reais e cinquentas centavos

    abcs

  2. Henrique 13/06/2010 às 01\0131

    Uma dica, pra deixar mais idiomático em Ruby, não precisa fazer essa salada com classes e singleton, apenas estenda a classe Numeric com o seu método. Assim:

    class Numeric

    def por_extenso(num)
    # …
    end

    end

    Assim seria mais adequado a OO:

    >> num = 23
    >> num.por_extenso
    => “vinte e tres”

  3. goncin 15/06/2010 às 08\0845

    @RenatoElias

    Obrigado pela visita e pelo comentário. Na verdade, eu não estava procurando inovar, apenas portar o meu código PHP para Ruby. Vou procurar pelo projeto a que você se referiu para ver como foi feito lá. A comparação é um excelente meio de aprendizado.

    @Henrique

    É verdade, eu poderia ter simplesmente estendido a classe Numeric, me esqueci dessa possibilidade. O que me preocupa, nesse caso, é a questão de arrendondamento dos números de ponto flutuante, que ocorre em todas as linguagens com as quais eu já trabalhei até hoje. Será que o Ruby arranhou uma solução para isso? Obrigado pelo comentário e pela visita.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: