English 中文(简体)
如何将ruby中美元和美分的十进制值转换为字符串值?
原标题:
  • 时间:2009-04-13 20:05:30
  •  标签:

我正在我的应用程序中存储一个成本。数据库中未格式化成本。例如: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中有没有一种简单的方法可以做到这一点?或者有人有这样的代码吗?

谢谢

最佳回答

您可以通过这一点Ruby代码来实现这一点:

fmt = "%05.2f" % cost
cost_dollars, cost_cents = fmt.split  . 
问题回答

如果您试图格式化视图中的美元值,您应该查看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"

number_to_currency很好,但可能会变得昂贵;如果你需要经常打电话的话,你可能想自己打。

您应该注意,使用浮动存储货币可能有问题,请参阅)。一种解决方案是使用整数表示货币并计算美分。这似乎是money插件。另一个解决方案是在迁移中使用十进制类型,这对于现代版本的Rails(>;1.2)来说应该是开箱即用的:

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

:小数位数是小数点后的位数,;精度为总位数。)这将使您Rails中的BigDecimal对象,这些对象比较难处理,但也不算太糟。

整数和小数方法都比浮点方法慢一点。我在某些地方使用浮动货币,因为我知道我不需要对Rails中的值进行计算,只需要存储和显示它们。但如果你需要精确的货币计算,就不要使用浮动汇率。

与其存储为十进制,不如存储为整数美分。因此,1美元以100的形式存储在数据库中。

或者,如果您不介意一点性能开销,请检查一下。在数据库的值中。如果存在,请拆分,并将这些片段解析为整数。

sprintf是您的朋友:

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




相关问题
热门标签