Tscott
Tscott

Reputation: 485

(Ruby) Padding single digits when it comes to time

I have 2 methods in a Timer class I'm creating. One method is where hours, minutes, and seconds are calculated from any given amount of seconds and the other method will pad any single digits with a "0". Every things I've look up so far isn't work for me. Below is my code:

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

so if I put in 7683, the output I want to get is "02:08:03". but when I execute it, I get the following error message:

(eval):6: (eval):6:in `-': String can't be coerced into Fixnum (TypeError)
from (eval):6:in `time'
from (eval):19

I'm confused where this is erroring out.

Upvotes: 0

Views: 334

Answers (4)

nunopolonia
nunopolonia

Reputation: 14417

There's no need to reinvent the wheel.

t = 7683 # seconds
Time.at(t).strftime("%H:%M:%S")

Time.at(seconds) converts your seconds into a time object, which then you can format with strftime. From the strftime documentation you can see you can get the parameters you want non padded, white padded or zero padded.

Upvotes: 1

Alireza
Alireza

Reputation: 2691

To answer your question as to why your code is not working, you have got couple of conversion issues between FixNum and String throughout your code, you can fix it as follows:

  def time_string(seconds)
    hours = seconds/3600
    minutes = seconds/60 - (hours * 60)
    seconds = seconds%60
    puts padded(hours)+':'+padded(minutes)+':'+padded(seconds)
  end

You use the hours variable in the second statement, but because its already converted to string, it crashes, therefore its better to do all the calculations first, and only later use the padded method which returns the padded digits in string format. The padded method must also be modified to be consistent:

def padded(x)
    if x.to_s.length == 1
        return "0"+x.to_s
    else
        return x.to_s
    end
end

Just keep in mind that the combination of the two methods will work only for numbers up to 86399, which will return 23:59:59. Any number passed to time_string bigger than that will pass the 24 hour mark and will return something like: 26:00:00

Upvotes: 1

Bala
Bala

Reputation: 11244

There is a brilliant method for padding, why not use it?

 3.to_s.rjust(10,"*") #=> "*********3" 
 4.to_s.rjust(2,"0")   #=> "04"
44.to_s.rjust(2,"0")   #=> "44"

If you want a better solution than writing your own class, use at

Time.at(7683).strftime("%H:%M:%S") #=> "02:08:03"

Upvotes: 1

Dan Reedy
Dan Reedy

Reputation: 1857

I tend to use something like this

"%02d" % 2  #=> 02
"%02d" % 13 #=> 13

It's part of the Kernel module: http://ruby-doc.org/core-2.1.3/Kernel.html#M001433

Upvotes: 0

Related Questions