(Ruby)当涉及到时间时填充单个数字

时间:2014-10-24 14:27:50

标签: ruby padding

我在创建的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

我很困惑这是错误的。

4 个答案:

答案 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