gpt4 book ai didi

ruby-on-rails - Ruby number_to_currency 显示一个完全错误的数字!

转载 作者:太空宇宙 更新时间:2023-11-03 17:27:58 25 4
gpt4 key购买 nike

您好!我是一名老 Delphi 程序员,正在跳转到 Mac、Ruby、Rails 和一般的 Web 编程。我报名参加了月底的 Advanced 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

索引 View 就在生成器之外,稍作修改以添加对我不利的格式。

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 %>

这似乎工作得很好。然后我开始使用生产数据进行测试,并遇到了 number_to_currency 的一个主要问题。

数据库中的数字是:10542.28,我用MySQL查询浏览器验证过。 RAILS 会将其显示为 10542.28 除非我调用 number_to_currency,然后该数字将显示为:$15422.80

错误似乎发生在 10,000.00 到 10,999.99 之间的任何数字上,到目前为止,我还没有看到超出该范围的错误,但显然我还没有测试所有内容。

我想我的解决方法是删除 number_to_currency,但这会使 View 看起来非常草率和不专业。格式困惑,排列不正确,我无法强制显示小数点后两位。

我真的希望有一个简单的解决方法。我无法想象这是一个普遍存在的问题。它会影响很多人,以至于有人会修复它!但我不知道从这里到哪里去。

我非常需要一些帮助。

(稍后 – number_with_precision 以与 number_to_currency 相同的方式失败。)

苏彼得森

最佳答案

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

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

DATA.each do |n|
puts formatted_number(n)
end

__END__
1
1.1
1.11
11
11.1
11.11
111
111.1
111.11
1111
1111.1
1111.11
11111
11111.1
11111.11
111111
111111.1
111111.11
1111111
1111111.1
1111111.11
11111111
11111111.1
11111111.11
111111111
111111111.1
111111111.11

输出

$1.00
$1.10
$1.11
$11.00
$11.10
$11.11
$111.00
$111.10
$111.11
$1,111.00
$1,111.10
$1,111.11
$11,111.00
$11,111.10
$11,111.11
$111,111.00
$111,111.10
$111,111.11
$1111,111.00
$1111,111.10
$1111,111.11
$1,1111,111.00
$1,1111,111.10
$1,1111,111.11
$11,1111,111.00
$11,1111,111.10
$11,1111,111.11

关于ruby-on-rails - Ruby number_to_currency 显示一个完全错误的数字!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2597212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com