【问题标题】:Rails store numbers with 2 decimal places after comma in databaseRails 在数据库中存储逗号后 2 位小数的数字
【发布时间】:2019-01-04 12:31:27
【问题描述】:

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

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

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

【问题讨论】:

  • 您没有存储两位小数的数字。 . 是小数,, 是千位分隔符。如果您希望将值存储为完全未更改的提交,那么您需要将其存储为字符串。然后,该数据的价值受到更多限制,即不能相加等。
  • 我检查了psql控制台中的值,它保存为1200.00,有两位小数,所以它是正确的。我只需要一种在从 DB 中检索值后正确格式化值的方法,因为 money-rails 将值转换为 Money 对象。我可以调用value.format 来获得一个适合显示但不适合计算的值。我还需要弄清楚这一点。
  • 我很抱歉@jedi,我快速阅读了你的两个问题。我假设您希望存储所有格式(例如逗号和句点)。
  • 没有问题。我只想保留两位小数。还没找到解决办法。

标签: ruby-on-rails money-rails


【解决方案1】:

您可以尝试以下,(在模型中使用)

ActiveSupport::NumberHelper::number_to_delimited('%.2f' % '3423432.43234', delimiter: ",", separator: ".")

# => "3,423,432.43"

这里,在上面的输入中3423432.43234是作为字符串提供的,你也可以作为数字提供。

在视图中可以直接使用number_with_delimiter

【讨论】:

  • 对不起,我的问题不是很精确,我现在已经更新了。我不想在视图中使用它,因为我只是创建了一个 PDF,然后将其上传到亚马逊,因此在视图中没有进一步的格式化等。这有意义吗?
  • 带逗号的格式化数字只能作为字符串存储在表格中,但如果您将它们检索回来进行计算,则必须通过删除逗号进行转换。
  • 我建议您将这些值作为浮点数存储在表中。但无论何时你想在网页视图或 PDF 模板中显示,都按我说的处理它。
  • "200,00".to_f #=&gt; 200.0, "200.00".to_f #=&gt; 200.0 所以将值存储为字符串以供进一步处理将无济于事,我猜。
  • @jedi 为什么你认为to_f 很聪明,试试'2334,343,44'.gsub(',','')
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多