2013-04-09 5 views
33

私は通貨を扱っています。小数点以下2桁まで切り捨てたいと思います。番号が500.0であっても、一貫性を保つために500.00にしたいと思います。 "500.00" .to_dを実行すると、500.0に変換されます。to_dルビに2桁の小数点以下を返す

この動作を変更する良い方法はありますか?私はまた、このメソッドを2桁に切り捨て、常に2小数を持つことを確認するために使用します。

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 

答えて

27

ここにヒントがあります。 500.00は、具体的には、sprintfのはあなたを助ける数500.0

の表現です:

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

を、本物のプログラマ*任意の*言語でCを書くことができます! ''%.2f'%500'はRubyイディオムです。 –

+3

@CamilleGoudeseune私はそれほど多年にわたりJavaを非難しています。/ – mcfinnigan

+1

sprintfは%よりも明示的です。私はIDEのsprintfでF1キーを押して簡単にパラメータの書式設定に関する助けを得ることができます –

73

mcfinniganの答えに加えて、あなたはまた、小数点以下2桁

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

を取得するには、以下を使用することができますこのユースケースは、string format operator

+0

魅力 –

7

として知られています。お金を表すために浮動小数点数を使用しないでください。なぜこれが悪い考えであるかの概要については、this questionを参照してください。

代わりに、金額を整数(セントを表す)として保存するか、その値を処理するための便利な機能をたくさん提供するmoney gemを見てください。

26

あなたがRailsのを使用していて、これは、ビューに関連すると思われますので、number_with_precisionがあります:

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

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

私はnumber_to_currencyお勧め:ことわざにあるとおり

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

@ajbraus私はそれを取得しません。書式設定はモデルに属していますか? 'number_with_precision'と' number_to_currency'は* view *ヘルパーです。 – Stefan

関連する問題