Ruby on rails Ruby number\u to\u currency显示的数字完全错误!

Ruby on rails Ruby number\u to\u currency显示的数字完全错误!,ruby-on-rails,ruby,Ruby On Rails,Ruby,你好!我是一个老的Delphi程序员,正在向Mac、Ruby、Rails和web编程迈进。我在月底报名参加高级Rails研讨会。与此同时,我一直在致力于将任务关键型(当然)应用程序从Delphi移植到RAILS。这感觉就像我过去一年的大部分时间都在埋头读书或播客 现在,我遇到了一个重大问题,我正在发疯。我真的不知道该怎么做,我非常不想用这个bug部署,我感到有点疯狂。(该公司的数据库目前运行在一个古老的XP机器上,看起来一天比一天更生锈。) 因此,我建立了一个测试数据库来显示这个问题。我在跑步:

你好!我是一个老的Delphi程序员,正在向Mac、Ruby、Rails和web编程迈进。我在月底报名参加高级Rails研讨会。与此同时,我一直在致力于将任务关键型(当然)应用程序从Delphi移植到RAILS。这感觉就像我过去一年的大部分时间都在埋头读书或播客

现在,我遇到了一个重大问题,我正在发疯。我真的不知道该怎么做,我非常不想用这个bug部署,我感到有点疯狂。(该公司的数据库目前运行在一个古老的XP机器上,看起来一天比一天更生锈。)

因此,我建立了一个测试数据库来显示这个问题。我在跑步:

 OS/X 10.6.3
 Rails 2.3.5
 ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0]
 MySQL 5.1.38-log via socket
 MySQL Client Version 5.1.8

ActiveRecord::Schema.define(:version => 20100406222528) do

     create_table “money”, :force => true do |t|
     t.decimal “amount_due”, :precision => 10, :scale => 2, :default => 0.0
     t.decimal “balance”, :precision => 10, :scale => 2, :default => 0.0
     t.text “memofield”
     t.datetime “created_at”
     t.datetime “updated_at”
     end
索引视图就在生成器的右边,稍加修改,添加了令我心碎的格式

Listing money
<table>

     <tr>
     <th>Amount</th>
     <th>Amount to_s </th>
     <th>Balance to $</th>
     <th>Balance with_precision </th>
     <th>Memofield</th>
     </tr>

<% @money.each do |money| %>

     <tr>
     <td><%=h money.amount_due %></td>
     <td><%=h money.amount_due.to_s(‘F’) %></td>
     <td><%=h number_to_currency(money.balance) %></td>
     <td><%=h number_with_precision(money.balance, :precision => 2) %></td>
     <td><%=h money.memofield %></td>
     <td><%= link_to ‘Show’, money %></td>
     <td><%= link_to ‘Edit’, edit_money_path(money) %></td>
     <td><%= link_to ‘Destroy’, money, :confirm => ‘Are you sure?’, :method => :delete %></td>
     </tr> *<% end %> *</table>

<%= link_to ‘New money’, new_money_path %>
上市资金
数量
总计
平衡到$
精密天平
梅姆菲尔德
2) %>
“你确定吗?”,:method=>:delete%>
* *
这似乎很有效。然后,我开始用生产数据进行测试,遇到了一个关于数字到货币的主要问题

数据库中的数字是:10542.28,我用MySQL查询浏览器进行了验证。RAILS将显示为10542.28,除非我将号码_调用为货币,否则该号码将显示为$15422.80

这个错误似乎发生在10000.00到10999.99之间的任何数字上,到目前为止,我还没有看到超出这个范围的错误,但是我显然没有测试所有的错误

我想我的解决办法是将数字转换成货币,但这会让视图看起来非常草率和不专业。格式混乱,东西排列不正确,我不能强制显示到小数点后2位

我真的希望有一个简单的解决办法。我无法想象这是一个普遍存在的问题。它会影响很多人,以至于有人会修复它!但我不知道接下来该怎么办

我非常需要帮助

(稍后–数字与精度的失败与数字与货币的失败相同。)

Sue Petersen可能与此有关:

可能与此有关:


在找到修复方法之前,您可以自己制作:)

输出
在找到解决方案之前,您可以自己制作:)

输出 另一个(更奇特的)解决方案可能会帮助您解决错误

def formatted_number(n, options={})
  options = {
    :precision => 2,
    :separator => '.',
    :delimiter => ',',
    :format => "$%s"
  }.merge(options)

  a,b = sprintf("%0.#{options[:precision]}f", n).split('.')
  a.gsub!(/(\d)(?=(\d{3})+(?!\d))/, "\\1#{options[:delimiter]}")
  sprintf(options[:format], "#{a}#{options[:separator]}#{b}")
end

DATA.each do |n|
  # default $1,234.56
  puts formatted_number(n)

  # precise $0.12345
  puts formatted_number(n, :precision => 5)

  # European 1.234,56 EUR
  puts formatted_number(n, :separator => ',', :delimiter => '.', :format => '%s EUR')

  # line break
  puts ''
end

__END__
5.5966
52.5344
3021.565
34809.48
25923.68342
输出 另一个(更奇特的)解决方案可能会帮助您解决错误

def formatted_number(n, options={})
  options = {
    :precision => 2,
    :separator => '.',
    :delimiter => ',',
    :format => "$%s"
  }.merge(options)

  a,b = sprintf("%0.#{options[:precision]}f", n).split('.')
  a.gsub!(/(\d)(?=(\d{3})+(?!\d))/, "\\1#{options[:delimiter]}")
  sprintf(options[:format], "#{a}#{options[:separator]}#{b}")
end

DATA.each do |n|
  # default $1,234.56
  puts formatted_number(n)

  # precise $0.12345
  puts formatted_number(n, :precision => 5)

  # European 1.234,56 EUR
  puts formatted_number(n, :separator => ',', :delimiter => '.', :format => '%s EUR')

  # line break
  puts ''
end

__END__
5.5966
52.5344
3021.565
34809.48
25923.68342
输出
@Smotchkiss我尝试了两种建议。他们都在我的系统上做了相同的事情。我怀疑这是我正在运行的Ruby版本中的某些东西

我花了一天的大部分时间试图在我的系统上安装一个更新版本的Ruby,最后放弃了,从Time Machine进行了一次完整的系统还原。我仍然在学习Mac的怪癖,我真的把RubyGems的安装搞砸了


@Andrew Grimm我想把这作为一个评论。我看没有办法这么做(运行雪豹、Firefox w NoScript)。我花了至少30分钟浏览FAQ,试图找到一种方法来留下评论而不是答案。不行

@Smotchkiss我尝试了两种建议。他们都在我的系统上做了相同的事情。我怀疑这是我正在运行的Ruby版本中的某些东西

我花了一天的大部分时间试图在我的系统上安装一个更新版本的Ruby,最后放弃了,从Time Machine进行了一次完整的系统还原。我仍然在学习Mac的怪癖,我真的把RubyGems的安装搞砸了

@Andrew Grimm我想把这作为一个评论。我看没有办法这么做(运行雪豹、Firefox w NoScript)。我花了至少30分钟浏览FAQ,试图找到一种方法来留下评论而不是答案。不行

这是一个答案,至少是部分答案

我设法加载了一个更新版本的Ruby(Ruby 1.8.7(2010-01-10 patchlevel 249)),问题就消失了。这显然是Ruby中的一个bug。现在我只需要弄清楚如何在我的MacBook和作为测试服务器使用的2台Mini上安装更新版本的Ruby

这是一个答案,至少是部分答案


我设法加载了一个更新版本的Ruby(Ruby 1.8.7(2010-01-10 patchlevel 249)),问题就消失了。这显然是Ruby中的一个bug。现在我只需要弄清楚如何在我的MacBook和作为测试服务器使用的2台Mini上安装更新版本的Ruby

我遇到了同样的问题。问题似乎在于将一个大的十进制数转换成一个浮点数。我在格式化的_number方法中更改了一行,并能够使数字按其应有的方式显示:

a,b = sprintf("%0.#{options[:precision]}f", n).split('.')
更改为:

a,b = sprintf("%0.#{options[:precision]}f", n.to_s.to_f).split('.')

先转换为字符串,然后再转换为浮点数就可以了。这是一个很好的方法,但在根本问题得到解决之前,它将对我们有效。

我遇到了同样的问题。问题似乎在于将一个大的十进制数转换成一个浮点数。我在格式化的_number方法中更改了一行,并能够使数字按其应有的方式显示:

a,b = sprintf("%0.#{options[:precision]}f", n).split('.')
更改为:

a,b = sprintf("%0.#{options[:precision]}f", n.to_s.to_f).split('.')

先转换为字符串,然后再转换为浮点数就可以了。它是hokey,但在根本问题得到解决之前,它将对我们起作用。

我最终在我所有的Mac电脑上加载了rvm gem,现在我正在运行ruby 1.8.7 p249。这为我解决了问题

我确实在Ruby中验证了这个bug,我发现了以下信息:


cihaks-听起来他们建议的临时补丁与您正在做的非常相似。无论如何,感谢您的帖子和信息。:-)

我在所有Mac电脑上都加载了rvm gem,现在运行的是ruby 1.8.7 p249。那个
class Float
  def to_currency
    a,b = sprintf("%0.2f", self).split('.')
    a.gsub!(/(\d)(?=(\d{3})+(?!\d))/, '\\1,')
    "$#{a}.#{b}"
  end
end

class Integer
  def to_currency
    a,b = sprintf("%0.2f", self).split('.')
    a.gsub!(/(\d)(?=(\d{3})+(?!\d))/, '\\1,')
    "$#{a}.#{b}"
  end
end

x = [100.236, 2, 123456789.1]
x.each do | n |
  puts x.to_currency
end

# Results
# $100.24
# $2.00
# $123,456,789.10