3

Given is a (time-value) String like:

local dt = "12:34:56"

I want to cut this string into

hh, mm, ss = "12", "34", "56"

therefore I use regex like this:

local hh = string.format("%02d", tonumber( dt:gsub(":..:..","") ))
local mm = string.format("%02d", tonumber( dt:gsub(":..:",""):gsub(":","") ))
local ss = string.format("%02d", tonumber( dt:gsub("..:..:","") ))

which works fine. ( The time string is coming from userinput, so I fill it with 0 if user writes "1" instead of "01")

But in cases where the value starts with 0, it is getting out of range for luas tonumber() (Signed zero I guess), same with "1", tonumber() seems to not handle values below "2") Could anyone tell me how to handle this situation?

Beside this, I would be happy if you could show me the bad practice in my regex, if there's some.

hjpotter92
  • 78,589
  • 36
  • 144
  • 183
jawo
  • 856
  • 1
  • 8
  • 24

1 Answers1

5

The whole thing can be shortened to this one liner:

local hh, mm, ss = dt:match "(%d%d?):(%d%d?):(%d%d?)"

As for the error occuring in your tonumber, it is because gsub returns 2 values after its operation. First being the substituted sring and the second being a number. tonumber assumes the second argument to be the base provided (which would be 1 I think). Since numbers with base 1 can only be 0; it raises an error.

hjpotter92
  • 78,589
  • 36
  • 144
  • 183