Je traite des devises et je veux arrondir le nombre à 2 décimales. Même si le nombre est 500,0, je voudrais que ce soit 500,00 pour être cohérent. Quand je fais "500.00" .to_d, il le convertit en 500.0.
Quel est un bon moyen de changer ce comportement? J'utilise également cette méthode pour arrondir à 2 chiffres et m'assurer qu'elle comporte toujours 2 décimales.
def self.round_down(x, n=2)
s = x.to_s
l = s.index('.') ? s.index('.') + 1 + n : s.length
s = s[0, l]
s = s.index('.') ? s.length - (s.index('.') + 1) == 1 ? s << '0' : s : s << '.00'
s.to_f
end
En plus de la réponse de mcfinnigan, vous pouvez également utiliser ce qui suit pour obtenir 2 décimales
'%.2f' % 500 # "500.00"
Ce cas d'utilisation est connu sous le nom de opérateur de format de chaîne
Puisque vous utilisez Rails et que cela semble être lié à une vue, il y a number_with_precision
:
number_with_precision(500, precision: 2)
#=> "500.00"
I18n.locale = :de
number_with_precision(500, precision: 2)
#=> "500,00"
Pour les devises, je suggère number_to_currency
:
number_to_currency(500)
#=> "$500.00"
Voici un indice. 500.00 est une représentation du nombre 500.0
Plus précisément, sprintf vous aidera à:
irb(main):004:0> sprintf "%.2f", 500.0
=> "500.00"
N'utilisez pas de nombres à virgule flottante pour représenter l'argent. Voir cette question pour un bon aperçu des raisons pour lesquelles c'est une mauvaise idée.
Au lieu de cela, stockez les valeurs monétaires sous forme d'entiers (représentant des cents), ou jetez un œil à la gemme money qui fournit de nombreuses fonctionnalités utiles pour gérer ces valeurs.
Il était nécessaire d'arrondir vers le BAS.
La plupart des autres réponses arrondissent 500.016 jusqu'à 500.02
Essayez:
def self.round_down(x, n = 2)
"%.#{n}f" % x.to_d.truncate(n)
end
irb(main):024:0> x=500.0; '%.2f' % x.to_d.truncate(2)
=> "500.00"
irb(main):025:0> x=500.016; '%.2f' % x.to_d.truncate(2)
=> "500.01"