6

アプリケーションにコストを保存しています。コストはデータベースでフォーマットされていません。例:00.00は0として保存、1.00は1として保存、40.50は40.5として保存

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

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

ありがとう!

4

5 に答える 5

18

あなたはこの少しのRubyコードでそれを達成することができます:

fmt = "%05.2f" % cost
cost_dollars, cost_cents = fmt.split '.'
于 2009-04-13T20:11:20.303 に答える
9

ビューでドルの値をフォーマットしようとしている場合はnumber_to_currency、ActionView :: Helpers::NumberHelperを確認する必要があります。

>> 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"
于 2009-04-13T20:31:36.870 に答える
7

number_to_currencyいいですが、高くつく可能性があります。あなたがそれをたくさん呼ぶ必要があるならば、あなたはあなた自身を転がしたいかもしれません。

これらの値に基づいて多くの計算を行う場合、floatを使用して通貨を格納することは問題になる可能性があることに注意する必要があります(およびを参照)。1つの解決策は、通貨とカウントセントに整数を使用することです。これは、 moneyプラグインで使用されているアプローチのようです。もう1つの解決策はdecimal、移行で型を使用することです。これは、Railsの最新バージョン(> 1.2)ではすぐに機能するはずです。

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

:scaleは小数点以下の桁数、:precisionは合計桁数です。)これにより、RailsでBigDecimalオブジェクトを取得できます。これは、操作が少し難しくなりますが、それほど悪くはありません。

整数と小数の両方のアプローチは、浮動小数点よりも少し遅くなります。Rails内の値を計算する必要がなく、保存して表示するだけでよいことがわかっているため、一部の場所では通貨にフロートを使用しています。ただし、正確な通貨計算が必要な場合は、フロートを使用しないでください。

于 2009-04-14T04:03:59.187 に答える
5

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

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

于 2009-04-13T20:08:56.130 に答える
3

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

cost_dollars = sprintf('%02.f', cost)
cost_cents = sprintf('%.2f', cost)
于 2009-04-13T20:19:46.273 に答える