如何在ruby中将小数转换为字符串值为美元和美分?

Ton*_*ony 5 ruby formatting ruby-on-rails decimal

我在我的应用程序中存储了一个成本.成本未在数据库中格式化.例如: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" .

有没有一种简单的方法在轨道上的红宝石中做到这一点?或者有人有代码执行此操作吗?

谢谢!

mip*_*adi 18

您可以使用这些一点Ruby代码来实现这一点:

fmt = "%05.2f" % cost
cost_dollars, cost_cents = fmt.split '.'
Run Code Online (Sandbox Code Playgroud)


jdl*_*jdl 8

如果您尝试在视图中格式化美元值,则应该number_to_currency在ActionView :: Helpers :: NumberHelper中查看.

>> bd = BigDecimal.new "5.75"   
>> include ActionView::Helpers
>> number_to_currency(bd)
=> "$5.75"
Run Code Online (Sandbox Code Playgroud)

至于将价值分解为单独的美元和美分,我的第一个问题是,"为什么?" 如果您有充分的理由,并且在数据库中处理小数,那么您可以执行以下操作.

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


Chi*_*aur 7

number_to_currency很好,但它可以变得昂贵; 如果你需要经常打电话,你可能想要自己动手.

您应该知道,如果您根据这些值进行大量计算,使用浮点存储货币可能会出现问题(并参见).一种解决方案是使用整数作为货币并计算美分.这似乎是钱插件使用的方法.另一个解决方案是decimal在迁移中使用一个类型,它应该可以在现有版本的Rails(> 1.2)中开箱即用:

add_column :items, :price, :decimal, :precision => 10, :scale => 2
Run Code Online (Sandbox Code Playgroud)

(:scale是小数点:precision后面的位数,是总位数.)这将获得Rails中的BigDecimal对象,这些对象有点难以使用,但也不会太糟糕.

整数和小数方法都比浮点慢一点.我在某些地方使用浮点数作为货币,因为我知道我不需要对Rails中的值进行计算,只存储和显示它们.但是,如果您需要准确的货币计算,请不要使用浮点数.


Joh*_*kin 5

而不是存储为十进制,存储为整数美分.因此,1美元存储100在数据库中.

或者,如果您不介意一点性能开销,请检查"." 在数据库的价值.如果存在,则拆分为".",并将这些部分解析为整数.