sprintf与sinatra不兼容吗?

时间:2011-10-06 21:41:56

标签: ruby sinatra

说我有这个:

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> 

2 个答案:

答案 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应该按预期工作。