返回包含方法计算内容的字符串



我有:

tv_sales = 601.5

使用此值,我想返回以下字符串:

"The total dollar amount of TVs sold today was 601.50."

这是我的代码:

def two_decimals(number) 
  puts sprintf('%0.2f', number)
end
puts "The total dollar amount of TVs sold today was #{two_decimals(tv_sales).to_s}."
#=> 601.50
#=> The total dollar amount of TVs sold today was

我怎样才能让退货在一行上,并且顺序正确?

你的方法应该返回值(隐式 - 作为最后一个计算的表达式,或显式 - 带有return ),而不是输出它,以便之后可以在字符串中插值:

def two_decimals number
  sprintf '%0.2f', number
end

演示

以下是您的代码正在执行的操作:

def two_decimals(number) 
  puts sprintf('%0.2f', number)  # => nil
end
tv_sales = 601.5                                                                          
puts "The total dollar amount of TVs sold today was #{two_decimals(tv_sales).to_s}."  # => nil
# >> 601.50
# >> The total dollar amount of TVs sold today was .
  • 第一个puts输出sprintf('%0.2f', number)的结果,601.50,首先显示在输出中。
  • 然后 Ruby 在退出 two_decimals 时返回 puts 的结果,导致nil
  • 该值被内插到包含对 two_decimals 的调用的字符串中,导致The total dollar amount of TVs sold today was .

通过删除第一个puts来修复它:

def two_decimals(number) 
  sprintf('%0.2f', number)  # => "601.50"
end
tv_sales = 601.5
puts "The total dollar amount of TVs sold today was #{two_decimals(tv_sales).to_s}."  # => nil
# >> The total dollar amount of TVs sold today was 601.50.

Ruby 会将601.50视为 sprintf 的返回值并返回它,该值将根据需要插入到字符串中。

没有必要

在字符串中使用to_s,当你插值到字符串中时,它是由 Ruby 自动提供的:

"#{two_decimals(tv_sales).to_s}"  # => "601.50"
"#{two_decimals(tv_sales)}"       # => "601.50"

我建议使用以下代码:

def two_decimals(number)
  number.round(2)
end
puts "The total dollar amount of TVs sold today was #{two_decimals(tv_sales)}."

您需要返回一个数字,而不是输出方法,以便可以将其转换为字符串。

最新更新