我在创建的Timer类中有2个方法。一种方法是从任何给定的秒数计算小时,分钟和秒,而另一种方法将用“0”填充任何单个数字。我到目前为止看到的每件事都不适合我。以下是我的代码:
class Timer
attr_accessor :seconds=(time), :time_string
def initialize(seconds = 00)
@seconds = seconds
end
def time_string
hours = padded((@seconds/3600)
minutes = padded(@seconds/60 - hours * 60)
seconds = padded(@seconds%60)
puts '#{hours):#{minutes}:#{seconds}'
end
def padded(x)
if x.length == 1
"0"+x
end
end
end
所以如果我输入7683,我想要的输出是“02:08:03”。但是当我执行它时,我收到以下错误消息:
(eval):6: (eval):6:in `-': String can't be coerced into Fixnum (TypeError)
from (eval):6:in `time'
from (eval):19
我很困惑这是错误的。
答案 0 :(得分:1)
有一种很棒的填充方法,为什么不使用它?
3.to_s.rjust(10,"*") #=> "*********3"
4.to_s.rjust(2,"0") #=> "04"
44.to_s.rjust(2,"0") #=> "44"
如果您想要比编写自己的课程更好的解决方案,请使用at
Time.at(7683).strftime("%H:%M:%S") #=> "02:08:03"
答案 1 :(得分:1)
要回答关于代码无效的问题,您在整个代码中遇到了FixNum和String之间的几个转换问题,您可以按如下方式修复:
def time_string(seconds)
hours = seconds/3600
minutes = seconds/60 - (hours * 60)
seconds = seconds%60
puts padded(hours)+':'+padded(minutes)+':'+padded(seconds)
end
你在第二个语句中使用hours
变量,但由于它已经转换为字符串,它会崩溃,因此最好先进行所有计算,然后再使用padded
方法以字符串格式返回填充的数字。还必须修改padded
方法以保持一致:
def padded(x)
if x.to_s.length == 1
return "0"+x.to_s
else
return x.to_s
end
end
请记住,这两种方法的组合仅适用于最高为86399的数字,这将返回23:59:59
。传递给time_string大于该值的任何数字都将通过24小时标记并返回如下内容:26:00:00
答案 2 :(得分:1)
没有必要重新发明轮子。
t = 7683 # seconds
Time.at(t).strftime("%H:%M:%S")
Time.at(秒)将您的秒数转换为时间对象,然后您可以使用strftime格式化。从strftime文档中,您可以看到您可以获得非填充,白色填充或零填充的参数。
答案 3 :(得分:0)
我倾向于使用类似这样的东西
"%02d" % 2 #=> 02
"%02d" % 13 #=> 13
它是内核模块的一部分:http://ruby-doc.org/core-2.1.3/Kernel.html#M001433