web-dev-qa-db-fra.com

to_d pour toujours renvoyer 2 décimales à ruby

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
47
ed1t

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

91
jvnill

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"
38
Stefan

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"
30
mcfinnigan

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.

11
Lars Haugseth

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"
2
webaholik