说我有这个:
class Account
...
property :charge, Decimal, :precision => 7, :scale => 2
...
classy stuff
...
def self.balance(prefix)
x = Account.get(prefix.to_sym).order(:fields => [:charge]).sum(:charge)
sprintf("%5.2f", x)
end
end
(编辑:所有:费用字段的值是0.13E2(0.1E2 + 0.3E1)。这是正确返回的。仅在视图中它似乎从sprintf
开始<) / em>的
在IRB中Account.balance(:AAA)
返回=> "13.00"
如果我从视图中调用Account.balance(:AAA)
,我会在/ accounts处获得 TypeError
无法将nil转换为Float
Account.balance(:AAA)
适用于我在视图中除之外的其他地方。如果我删除sprintf("%5.2f", x)
,我会在我的视图中获得0.13E2
。 (在视图中使用Account.balance(:AAA).to_f
为我提供13.0
)
Sinatra与sprintf
不相容吗?或者我不明白如何使用sprintf
?
(编辑:这是令人讨厌的观点:)
<section>
<% @accounts.each do |account| %>
<article>
<h2><%= account.prefix %></h2>
<span><p>This account belongs to <%= account.name %> & has a balance of $<%= Account.balance(account.prefix) %>.</p></span>
</article>
<% end %>
</section>
答案 0 :(得分:2)
将balance
定义为实例方法而不是类方法会不会更有意义?从您的示例中可以看出,您仍然以balance
特定的方式调用account
,所以为什么不这样做:
# the model
class Account
#...
def balance
amount = self.order(:fields => [:charge]).sum(:charge)
sprintf "%5.2f", amount
# or the infix version:
"%5.2f" % amount
end
end
,
# the view
...balance of $<%= account.balance %>...
我知道这本身并没有解决sprintf
问题,但问题更可能来自稍微复杂的查找而不是来自内置方法。即使我的特定代码不适合您的应用程序,也可能值得简化查找步骤,即使这涉及更多代码行。
这种方法的优点是毫无疑问,您将获得正确的Account
记录。
答案 1 :(得分:1)
用一个小的sinatra应用程序对它进行测试,它对我有用
app.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'sinatra'
get '/' do
@x = 10.23
erb :index
end
视图/ index.erb
<%= sprintf("%5.2f", @x) %>
输出:
10.23
ruby 1.9.2 / sinatra 1.3.1
我认为由于您的错误消息,sprintf之前还有另一个错误:
can't convert nil into Float
好像你的x是零。尽量确保x不是nil,然后sprintf应该按预期工作。