Humanizar moeda

Eu queria remover as casas decimais de zero à direita de um float e exibir apenas o número como um inteiro. No entanto, se esses decimais forem relevantes, os primeiros 2 decimais finais devem ser mostrados.

A abordagem normal dita o uso de alguma manipulação básica de string na forma de:

 > "%.2f % 2.509
=> 2.50

> "
%g" % 2.00
=> 2

Perfeito! uma combinação dos dois deve fazer o truque, certo?

> "%g" % ("%.2f" % 2.00)
=> 2 # :)
> "%g" % ("%.2f" % 2.50)
=> 2.5 # :(

Que tal comparar valores?

> 2.00 == 2.00.to_i
=> true # wtf?

Traga as bananas!

Numeric.class_eval do
def has_significant_zeros?
begin
!Integer("%g" % self)
rescue ArgumentError, TypeError
true
end
end
end

> number = 2.00
> number.to_i unless number.has_significant_zeros?
=> 2
> number = 2.50
> number.to_i unless number.has_significant_zeros?
=> nil

Agora podemos implementar o que quisermos, até mesmo a abordagem anterior, por exemplo

def sanitize_currency(number)
return "%.2f" % number if number.has_significant_zeros?

number
.to_i
end