2013-04-09 22 views
33

ho a che fare con le valute e voglio arrotondare il numero a 2 cifre decimali. Anche se il numero è 500.0, vorrei che fosse 500.00 per essere coerente. Quando faccio "500.00" .to_d lo converte in 500.0.to_d per tornare sempre 2 decimali posti in rubino

Che cosa è un buon modo di cambiare questo comportamento? Uso questo metodo anche per arrotondare a 2 cifre e verificare che contenga sempre 2 decimali.

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 

risposta

27

Ecco un suggerimento. 500,00 è una rappresentazione del numero 500.0

In particolare, sprintf vi aiuterà a:

irb(main):004:0> sprintf "%.2f", 500.0 
=> "500.00" 
+10

Come dice il proverbio, Vero Programmatore puoi scrivere C in * qualsiasi * lingua! ''% .2f'% 500' è l'idioma di Ruby. –

+3

@CamilleGoudeseune Do la colpa a troppi anni di Java:/ – mcfinnigan

+1

sprintf è più esplicito di% e posso facilmente ottenere aiuto sulla formattazione dei parametri premendo F1 su sprintf nel mio IDE –

73

Oltre alla risposta di mcfinnigan, è anche possibile utilizzare il seguente per ottenere 2 cifre decimali

'%.2f' % 500 # "500.00" 

Questo caso d'uso è noto come il string format operator

+0

Mi piace, semplice pulito, funziona come un fascino –

7

non usare i numeri in virgola mobile per rappresentare i soldi. Vedere this question per una buona panoramica del perché questo è una cattiva idea.

Invece, memorizzare i valori monetari come numeri interi (che rappresentano i centesimi) o dare un'occhiata alla gemma money che fornisce molte funzionalità utili per gestire tali valori.

26

Dal momento che si sta utilizzando Rails e questo sembra essere correlato ad una vista, c'è number_with_precision:

number_with_precision(500, precision: 2) 
#=> "500.00" 

I18n.locale = :de 
number_with_precision(500, precision: 2) 
#=> "500,00" 

Per le divise Io suggerirei number_to_currency:

number_to_currency(500) 
#=> "$500.00" 
+10

@ajbraus io non capisco. La formattazione appartiene al modello? 'number_with_precision' e' number_to_currency' sono * view * helpers. – Stefan

Problemi correlati