2009-04-13 6 views
4

私は自分のアプリケーションにコストを格納しています。コストはデータベースでフォーマットされません。たとえば、00.00は0として保存し、1.00は1として保存し、40.50は40.5として保存します。ルビのドルとセントの10進数を文字列値に変換するにはどうすればよいですか?

これらの値をデータベースから読み込み、ドルとセントの文字列に変換する必要があります。たとえば、0 - > cost_dollars = "00" & cost_cents = "00"、1 - > cost_dollars = "01" & cost_cents = "00"、40.5 - > cost_dollars = "40" & cost_cents = "50" 。

これをRuby on Railで簡単に行う方法はありますか?あるいは、誰かがこれを行うコードを持っていますか?

ありがとうございます!

答えて

15

あなたはRubyコードのこの小さなビットでそれを達成することができます

fmt = "%05.2f" % cost 
cost_dollars, cost_cents = fmt.split '.' 
+0

非常に便利ですが、私はsprintfを認識していましたが、 "%"のこのプレーンな使い方ではありません。 –

+0

フォーマット指定子( '%05。2桁の文字列が小数点以下5桁未満の場合はパディングを使用し、小数点以下の場合は2桁を意味します。浮動小数点を意味します。 [フルスペック](https://www.tutorialspoint.com/c_standard_library/c_function_sprintf.htm) – aidan

5

小数点として格納する代わりに、整数の整数を格納します。したがって、1ドルは100としてデータベースに格納されます。

また、パフォーマンスのオーバーヘッドに気にしない場合は、「。」を確認してください。データベースの価値に存在する場合は '。'で分割し、整数を解析します。

2

はsprintfはここにあなたの友達です:

cost_dollars = sprintf('%02.f', cost) 
cost_cents = sprintf('%.2f', cost) 
+1

これは動作しません。 'cost_dollars'は丸められ(必ずしもあなたが望むとは限りません)、' cost_cents'にはセントに加えてドルも含まれます。 –

8

ビューでドルの値をフォーマットしようとしている場合は、 ActionView :: Helpers :: NumberHelperのnumber_to_currencyを見てください。

>> bd = BigDecimal.new "5.75" 
>> include ActionView::Helpers 
>> number_to_currency(bd) 
=> "$5.75" 

別々のドルとセントに値を分割すると、私の最初の質問は「なぜですか?」となります。正当な理由があり、データベースの小数点以下を扱っている場合、次のことができます。

>> bd = BigDecimal.new "5.75" 
>> "dollars:#{bd.truncate} cents:#{bd.modulo(1) * BigDecimal.new('100')}" 
=> "dollars:5.0 cents:75.0" 
7

number_to_currencyいいですが、それは高価得ることができます。あなたはそれをたくさん呼び出す必要がある場合は、あなた自身を回したいかもしれません。

これらの値に基づいて多くの計算を行う場合は、floatを使用して通貨を保存することに注意してください。can be problematicand see) 1つの解決策は、通貨および数セントに整数を使用することです。これはmoney pluginで使用されているアプローチのようです。別の解決策は、Railsのの最近のバージョンのためのアウトオブボックス動作するはず移行でdecimalタイプ、(> 1.2)を使用することです:

add_column :items, :price, :decimal, :precision => 10, :scale => 2 

:scaleは、小数点以下過去の桁数です:precisionは桁数の合計です)。これにより、レールにはBigDecimalのオブジェクトが表示されますが、作業が少し難しくなりますが、それほど悪くはありません。

整数アプローチと小数点アプローチはどちらも浮動小数点より少し遅いです。私はいくつかの場所で通貨用の浮動小数点数を使用しています。なぜなら、Rails内の値を計算して格納して表示する必要がないことがわかっているからです。しかし、正確な通貨計算が必要な場合は、浮動小数点を使用しないでください。

+0

私は10進数を使用しています、ありがとう – Tony

関連する問題