Rails在数据库中用逗号后的小数点后两位存储数字

时间:2019-01-04 12:31:27

标签: ruby-on-rails money-rails

我正在为系统中的发票制作PDF,我希望能够在数据库中存储两位小数的数字。我正在使用MoneyRails宝石来处理货币,我已经在数据库级别设置了precision: 10scale: 2(我将postgres作为数据库),但是我只得到1逗号后的小数位。为什么?

class AddPrecisionToInvoices < ActiveRecord::Migration[5.2]
  def self.up
    change_column :invoices, :total_net_amount_cents, :decimal, precision: 10, scale: 2, default: 0.00
    change_column :invoices, :total_gross_amount_cents, :decimal, precision: 10, scale: 2, default: 0.00
  end

  def self.down
    change_column :invoices, :total_net_amount_cents, :bigint
    change_column :invoices, :total_gross_amount_cents, :bigint
  end
end

invoice.rb

monetize :total_net_amount_cents
monetize :total_gross_amount_cents

在Rails控制台中,

invoice.total_gross_amount_cents = Money.new(20_000_00)
invoice.total_gross_amount.to_f #=> 2000.0

是否可以在数据库中存储两位小数的数字,例如20,000.00? 我不想在视图中显示PDF,所以我希望能够将数字从前端应用程序的params中获取时放入数据库中,而无需在视图中进一步格式化。

2 个答案:

答案 0 :(得分:0)

您可以尝试关注(在模型中使用)

3423432.43234

在此,在上面的输入number_with_delimiter中以字符串形式提供,也可以将其以数字形式提供。

您可以直接在视图中使用names

答案 1 :(得分:0)

money-rails gem需要monetize列才能在数据库中为数字。但是,它附带了some helper methods,可用于在模型中按需重新格式化:

# inside Invoice model
require "money-rails/helpers/action_view_extension"
class Invoice < ApplicationRecord
  include MoneyRails::ActionViewExtension
  # ...
  def total_gross_amount_formatted
    humanized_money total_gross_amount
  end
end

然后在您的PDF中,您可以仅引用新的格式化属性:

@invoice_instance.total_gross_amount_formatted