【问题标题】:How do I configure Rails to output decimals to the correct precision in form fields?如何配置 Rails 以在表单字段中以正确的精度输出小数?
【发布时间】:2011-04-27 05:58:44
【问题描述】:

我想将货币存储在我的(sqlite 和 mysql)数据库中。我正在尝试使用decimal 列类型和:scale => 2

这与预期不符。如果我用:rate => 10.50 保存记录,它会以10.5 的形式存储在我的sqlite 数据库中。另外,当我在表单域中输出值时,显示为10.5

我不想每次想在 Rails 表单中很好地显示值时都进行 hacky 字符串格式化。

有没有办法解决这个问题?这是一个sqlite的东西吗?我只是误解了decimal 列类型吗?

编辑:

为了澄清,我希望能够使用通常的表单生成方法:

- form_for @project do |f|
  = f.text_field :rate

如果我必须明确格式化输出,我将不得不为每个小数属性创建额外的方法:

def formatted_rate
  "%.2f" % rate
end

= f.text_field :formatted_rate

还有其他常见的技巧来强制输出格式,并且仍然使用默认的 Rails 表单构建器吗?

【问题讨论】:

  • 对视图进行编码以将数字显示到小数点后两位并没有什么“hacky”;这是理想的解决方案。当您指定小数精度时,您指定的是最大值,而不是最小值 - 数字永远不会与尾随或前导零一起存储。
  • 虽然不是完全重复,但这些答案几乎都适用:stackoverflow.com/questions/591939/…

标签: mysql ruby-on-rails sqlite decimal precision


【解决方案1】:

你可以使用 Rails ActionView Number Helper number_with_precision:

number_with_precision(my_number, :precision => 2)

【讨论】:

  • 这不会帮助我很好地输出表单字段中的值
  • 还有一个“number_to_currency”方法
  • @nfm <%= f.text_field :rate, :value => number_with_precision(f.object.rate) %>
【解决方案2】:

我最终编写了一个插件来执行此操作:currency_text_field

您可以在config/initializers/currency_text_field_initializer.rb 中定义格式(number_with_precision 的参数)。

然后在表单中使用f.currency_text_field :rate,并带有可选的:format 参数以在初始化程序中使用命名格式。否则它使用初始化器中的format[:default]

与显式设置value 的方法相同,但所有操作都在幕后进行,并将选项集命名为number_with_precision

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多