我正在开发一个非常基本的购物车系统。

我有一个表items,它的列价格类型为整型。

我在视图中显示包含欧元和美分的价格时遇到了麻烦。在Rails框架中处理货币时,我是否遗漏了一些明显的东西?


当前回答

使用金钱轨道宝石。它在你的模型中很好地处理金钱和货币,也有一堆帮助来格式化你的价格。

其他回答

我的底层api都使用美分来表示钱,我不想改变这一点。我也没有大量的资金。我把这个放到helper方法中

sprintf("%03d", amount).insert(-3, ".")

它将整数转换为至少有三位数字的字符串(必要时添加前导零),然后在最后两位数字之前插入一个小数点,从不使用Float。从这里,您可以添加任何适合您的用例的货币符号。

这绝对是快速和肮脏的,但有时这是好的!

您可能希望在数据库中使用DECIMAL类型。在迁移过程中,执行如下操作:

# precision is the total number of digits
# scale is the number of digits to the right of the decimal point
add_column :items, :price, :decimal, :precision => 8, :scale => 2

在Rails中,:decimal类型返回为BigDecimal,这对于价格计算非常有用。

如果您坚持使用整数,那么您将不得不在所有地方手动转换为bigdecimal,这可能会成为一个麻烦。

正如mcl所指出的,要打印价格,请使用:

number_to_currency(price, :unit => "€")
#=> €1,234.01

我是这样用的:

number_to_currency(amount, unit: '€', precision: 2, format: "%u %n")

当然,货币的符号、精度、格式等都取决于每种货币。

使用金钱轨道宝石。它在你的模型中很好地处理金钱和货币,也有一堆帮助来格式化你的价格。

如果有人正在使用Sequel,那么迁移将会是这样的:

add_column :products, :price, "decimal(8,2)"

Sequel忽略了:precision和:scale

续作版本:续作(3.39.0,3.38.0)