3 posts
                
             
            
                Posted 03 November 2014 - 06:26 PM
                Hey there!
I've some problems making a Countdown timer.
local mon = peripheral.wrap("top")
mon.clear()
local i = 1
local j = 20
repeat
  if i > 0 then
   if j > 0 then
	  j = j - 1
	else
	  j = 59
	  i = i - 1
	end
	else
   if j > 0 then
	  j = j - 1
	end
  
  local seconds = ""..j
  if j < 10 then
	seconds = "0"..j
	end
  end
  mon.setTextScale(5)
  mon.clear()
  mon.setCursorPos(2,1)
  mon.write(i..":"..j)
sleep(1)
until i == 0 and j == 0
But under the 10 seconds you get this:

But I want 00:07 ect and not 0:7
Last question if you can make a thing, so you can place a redstone signal from the back so you can reset it and start it when the redstone is powered.
Many thanks :D/>
 
                
             
         
        
        
            
            
                
                    
                
                3057 posts
                
                    
                        Location
                        United States of America
                    
                
             
            
                Posted 03 November 2014 - 08:32 PM
                The problem is, lua treats 07 as 7.  To fix this, give this your number:
local function double( n )
  return n >= 10 and n or "0" .. tostring( n )
end
After placing this in your code, you can use it like this
mon.write(double( i )..":"..double( j ))
 
                
                    Edited on 03 November 2014 - 07:33 PM
                
             
         
        
        
            
            
                
                    
                
                1080 posts
                
                    
                        Location
                        In the Matrix
                    
                
             
            
                Posted 03 November 2014 - 09:44 PM
                Yami's way works, however I prefer string.format :P/>
local function double( l )
  return string.format("%02d",l)
end
mon.write(double( i )..":"..double( j ))
in the string.format you see %02d which for the purposes of this says put a zero on the left if the next number isn't two digits long. And you can expand it if you want hundreds and such just change that 2 to a 3. Yami's version requires more fiddling if you want hundreds and such.
 
                
                    Edited on 03 November 2014 - 08:48 PM
                
             
         
        
        
            
            
                
                    
                
                8543 posts
                
             
            
                Posted 03 November 2014 - 10:13 PM
                I don't really trust LuaJ's string.format. It's kinda broken in a few areas. If the above works, great. If not, this is probably the easiest. It takes a number or numeric string and returns a numeric string of the specified number of characters, properly padded with zeroes.
function pad(num, len)
  if tonumber(num) >= 0 then
    return string.sub(string.rep("0", len)..tostring(num), 0 - len)
  else
    return "-"..string.sub(string.rep("0", len - 1)..string.sub(tostring(num), 2), 1 - len)
  end
end
 
                
             
         
        
        
            
            
                
                    
                
                3 posts
                
             
            
                Posted 03 November 2014 - 10:14 PM
                Final code:
Error: Countdown:30: attempt to call nil
local mon = peripheral.wrap("top")
mon.clear()
local i = 1
local j = 20
repeat
  if i > 0 then
   if j > 0 then
	  j = j - 1
	else
	  j = 59
	  i = i - 1
	end
	else
   if j > 0 then
	  j = j - 1
	end
  local function double( n )
	return n >= 10 and n or "0" .. tostring( n )
  end
end
  mon.setTextScale(5)
  mon.clear()
  mon.setCursorPos(2,1)
  mon.write(double( i )..":"..double( j ))
sleep(1)
until i == 0 and j == 0
 
                
                    Edited on 04 November 2014 - 05:20 AM
                
             
         
        
        
            
            
                
                    
                
                129 posts
                
             
            
                Posted 04 November 2014 - 06:02 PM
                There's the working code!
local mon = peripheral.wrap("top")
mon.clear()
--Setting variables
done = false
i = 1 --minutes
j = 20 --seconds
min = 0
sec = 0
while done == false do
	if i > 0 then
		if j > 0 then
			j = j - 1
		else
			j = 59
			i = i - 1
		end
	else
		if j > 0 then
			j = j - 1
		else
			done = true
		end
	end
	if j > 9 then
		sec = j
	else
		sec = "0"..j
	end
	min = i
	sleep(1)
	--Returning Results
	mon.setTextScale(5)
	mon.clear()
	mon.setCursorPos(2,1)
	mon.write(min..":"..sec)
end
 
                
                    Edited on 04 November 2014 - 05:02 PM
                
             
         
        
        
            
            
                
                    
                
                3 posts
                
             
            
                Posted 04 November 2014 - 08:33 PM
                Thank you so much Thejenforge. Its working :D/>
[media]
http://www.youtube.com/watch?v=1EUQsBces1I[/media]
 
                
                    Edited on 04 November 2014 - 09:56 PM
                
             
         
        
        
            
            
                
                    
                
                7083 posts
                
                    
                        Location
                        Tasmania (AU)
                    
                
             
            
                Posted 04 November 2014 - 10:34 PM
                Final code:
Error: Countdown:30: attempt to call nil
In the case of that code, you declared your double() function as being local to your repeat loop - meaning you couldn't access it from outside that loop.
http://lua-users.org/wiki/ScopeTutorial