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_currencyActionView::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很好,但它可能会变得昂贵;如果你需要经常调用它,你可能想自己动手。

您应该知道,如果您根据这些值进行大量计算,使用浮点数存储货币可能会出现问题请参阅)。一种解决方案是使用整数表示货币并计算美分。这似乎是money 插件使用的方法。另一种解决方案是在您的迁移中使用一种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 回答