Ruby on rails 如何获得完整的价格为金钱宝石

Ruby on rails 如何获得完整的价格为金钱宝石,ruby-on-rails,gem,currency,Ruby On Rails,Gem,Currency,我正在使用,我想知道我如何才能得到像23.45、10.00、0.32这样的价格,以美元/美分的形式显示在一个字段中?我希望我的美分字段变成价格货币或美元美分 这是我的密码: 我的货币宝石模型由以下部分组成: composed_of :price, :class_name => "Money", :mapping => [%w(price cents), %w(currency currency_as_string)], :constructor =&

我正在使用,我想知道我如何才能得到像23.45、10.00、0.32这样的价格,以美元/美分的形式显示在一个字段中?我希望我的美分字段变成价格货币或美元美分

这是我的密码:

我的货币宝石模型由以下部分组成:

composed_of :price,
    :class_name  => "Money",
    :mapping     => [%w(price cents), %w(currency currency_as_string)],
    :constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency || Money.default_currency) },
    :converter   => Proc.new { |value| value.respond_to?(:to_money) ? value.to_money : raise(ArgumentError, "Can't conver #{value.class} to Money") }
为了简洁起见,我删去了以下部分:

我的迁移或价格表:

我好像少了一个专栏什么的。它甚至被认为是单独的美分?不确定,所以我需要你的帮助

谢谢您抽出时间。

好吧

在DB表中,以整数形式保存分:

 t.integer :cents, :default => 0
尝试将其更改为:

 t.decimal :cents, :default => 0

我下载了gem并测试了一些选项。以下是您可以执行的示例:

money = Money.new(1000, "USD")
money.cents     #=> 1000
money.dollars   #=> 10.0
因此,在我看来,您应该在模型价格中采用类似的方法:

def value
  cents / 100.0
end
并在视图中或任何需要货币价值(而不是美分)的地方使用它。当添加价格时,您使用的是美分,因此要获得12.34的价格,您应该将其设置为1234美分。如果您想添加12.34这样的价格,我想您应该在创建/更新操作时在controller中解析它,或者在保存之前使用filter的模型中解析它,或者类似的东西。只需将其乘以100,即可节省分贝

编辑: 用于向视图中添加零的帮助器方法

def with_zeros(price)
  array = price.to_s.split('.')
  array[1] = array[1].ljust(2,'0')
  array.join('.')
end

好的,我能弄明白,谢谢大家

这是我的新代码:

数据库现在是:price而不是:cents-

create_table :prices do |t|
  t.integer :user_id
  t.string :name
  t.date :date
  t.integer :price, :default => 0
  t.string :currency
表格面积:

  <div class="field">
    <%= f.label :price %><br />
    <%= f.text_field :price %>
  </div>

我只需要使它的组合_匹配映射、数据库列和表单,出于某种奇怪的原因,它开始完全工作。感谢大家的帮助,我学到了很多关于ruby和rails的知识。

刚刚遇到了完全相同的问题,如果您不想像在选择的答案中那样更改DB,只需查看gem的源代码,看看是否有什么可以使用的:

在本模块中,您将注意到两件事:

一种叫人性化的钱的方法 在该方法中,对money对象的方法格式的调用 因此,只需调用@my_money_object.format,然后……砰,您的money对象格式为一个包含美元的字符串,美分金额的精度为2

例如:

@my_money_object = 20.to_money
@my_money_object.format
=>20.00美元


这确实是正确的解决方案。你明确地说,你只想得到一个完整的价格,如45.23美元的方法。现在,如果你想把这个格式化的字符串放在你的DB中,那就取决于你,但是我会考虑只需要在货币对象上调用格式化方法。我需要在一个控制器中获得格式化的价格,并且显然无法使用人性化的钱方法,除非我没有尝试破解其他方法来实现这一点,所以我检查了源代码并找到了这个。如果这对你有任何帮助,请投赞成票。

也许这会有帮助:只要看一下:你在视图中有分贝和货币,无论是哪一种,所以货币23.45==2345分。@a开头我实际上是按照你给出的公认答案开始的,创建了所有类似的内容,但仍然存在上述问题。@santuxus我也在考虑同样的问题,但我不确定如何配置它,所以我得到了全部金额。现在这在一定程度上是可行的,我可以把23.45放进去,但如果我把23.50放进去,结果是23.5。23.50与23.5完全相同-如果你想在最后得到0,我认为你必须用rubyYou对它进行格式化,但这样人们就不会感到困惑了,23.50美元就更合理了。数据是以数字形式来自数据库的,你需要将其转换为字符串,以零作为pad id。对于你的特殊情况,如果最后是0,它会更有意义-但是没有办法知道默认设置多少个零是有意义的。我实际上不想用美分来做,我只是按照这个网站上的教程和问题来做。我只想在一个领域获得45.23美元的完整价格。在这种情况下,我认为都铎·康斯坦丁给出了一个你正在寻找的解决方案。。。可以添加一个助手方法,该方法可以在视图中添加所需的零。我在上面添加了代码-它返回逗号后带数字的字符串
  <div class="field">
    <%= f.label :price %><br />
    <%= f.text_field :price %>
  </div>
composed_of :price,
    :class_name  => "Money",
    :mapping     => [%w(price cents), %w(currency currency_as_string)],
    :constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency || Money.default_currency) },
    :converter   => Proc.new { |value| value.respond_to?(:to_money) ? value.to_money : raise(ArgumentError, "Can't conver #{value.class} to Money") }
@my_money_object = 20.to_money
@my_money_object.format