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