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