我正在开发一个非常基本的购物车系统。
我有一个表items,它的列价格类型为整型。
我在视图中显示包含欧元和美分的价格时遇到了麻烦。在Rails框架中处理货币时,我是否遗漏了一些明显的东西?
我正在开发一个非常基本的购物车系统。
我有一个表items,它的列价格类型为整型。
我在视图中显示包含欧元和美分的价格时遇到了麻烦。在Rails框架中处理货币时,我是否遗漏了一些明显的东西?
当前回答
我的底层api都使用美分来表示钱,我不想改变这一点。我也没有大量的资金。我把这个放到helper方法中
sprintf("%03d", amount).insert(-3, ".")
它将整数转换为至少有三位数字的字符串(必要时添加前导零),然后在最后两位数字之前插入一个小数点,从不使用Float。从这里,您可以添加任何适合您的用例的货币符号。
这绝对是快速和肮脏的,但有时这是好的!
其他回答
使用Virtual Attributes(链接到修订的(付费)Railscast),您可以将price_in_cents存储在一个整数列中,并在您的产品模型中添加虚拟属性price_in_dollars作为getter和setter。
# Add a price_in_cents integer column
$ rails g migration add_price_in_cents_to_products price_in_cents:integer
# Use virtual attributes in your Product model
# app/models/product.rb
def price_in_dollars
price_in_cents.to_d/100 if price_in_cents
end
def price_in_dollars=(dollars)
self.price_in_cents = dollars.to_d*100 if dollars.present?
end
来源:RailsCasts #016:虚拟属性:虚拟属性是添加不直接映射到数据库的表单字段的一种干净的方式。在这里,我将展示如何处理验证、关联等。
使用金钱轨道宝石。它在你的模型中很好地处理金钱和货币,也有一堆帮助来格式化你的价格。
绝对的整数。
即使BigDecimal技术上存在,1.5仍然会在Ruby中给你一个纯浮点数。
如果你正在使用Postgres(因为我们现在已经是2017年了),你可能想尝试一下他们的:money列。
add_column :products, :price, :money, default: 0
我的底层api都使用美分来表示钱,我不想改变这一点。我也没有大量的资金。我把这个放到helper方法中
sprintf("%03d", amount).insert(-3, ".")
它将整数转换为至少有三位数字的字符串(必要时添加前导零),然后在最后两位数字之前插入一个小数点,从不使用Float。从这里,您可以添加任何适合您的用例的货币符号。
这绝对是快速和肮脏的,但有时这是好的!