我在我的应用程序中存储了一个成本。成本未在数据库中格式化。例如: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”。
有没有一种简单的方法可以在轨道上的红宝石中执行此操作?或者有人有代码执行此操作吗?
谢谢!
答案 0 :(得分:18)
您可以使用这一点Ruby代码来实现这一点:
fmt = "%05.2f" % cost
cost_dollars, cost_cents = fmt.split '.'
答案 1 :(得分: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"
答案 2 :(得分:7)
number_to_currency
很好,但它可能会变得昂贵;如果你需要经常打电话,你可能想要自己动手。
如果您根据这些值进行大量计算,则应注意使用浮点数来存储货币can be problematic(and see)。一种解决方案是使用整数作为货币并计算美分。这似乎是money plugin使用的方法。另一种解决方案是在迁移中使用decimal
类型,对于现代版本的Rails(> 1.2),它应该是开箱即用的:
add_column :items, :price, :decimal, :precision => 10, :scale => 2
(:scale
是小数点后的位数,:precision
是总位数。)这将在Rails中获得BigDecimal个对象,这有点难以理解与...合作,但不是太糟糕。
整数和小数方法都比浮点慢一点。我在某些地方使用浮点数作为货币,因为我知道我不需要对Rails中的值进行计算,只存储和显示它们。但如果您需要准确的货币计算,请不要使用浮点数。
答案 3 :(得分:5)
不是存储为小数,而是存储为整数分数。因此,1美元将作为100
存储在数据库中。
或者,如果您不介意一点性能开销,请检查'。'在数据库的价值。如果它存在,则拆分为“。”,并将这些块解析为整数。
答案 4 :(得分:2)
sprintf是你的朋友:
cost_dollars = sprintf('%02.f', cost)
cost_cents = sprintf('%.2f', cost)