Log In  


Here is a simple function to convert a number to its hexadecimal string representation:

function num2hex(number)
	local base = 16
	local result = {}
	local resultstr = ""

	local digits = "0123456789abcdef"
	local quotient = flr(number / base)
	local remainder = number % base

	add(result, sub(digits, remainder + 1, remainder + 1))

  while (quotient > 0) do
  	local old = quotient
  	quotient /= base
  	quotient = flr(quotient)
  	remainder = old % base

		 add(result, sub(digits, remainder + 1, remainder + 1))
  end

  for i = #result, 1, -1 do
  	resultstr = resultstr..result[i]
  end

  return resultstr
end

Usage:

	print(num2hex(255)) -- ff
	print(num2hex(10)) -- a
	print(num2hex(1050)) -- 41a
2


The built-in tostr() function can do hex if you pass a second arg of 'true':

> i=255
> print(tostr(i))
255
> print(tostr(i,true))
0x00ff.0000

If you want something that isn't the full 32-bit value, you can strip off the '0x' and the leading/trailing '0's pretty easily by checking individual characters. This is the function I use:

-- note that ord('0') is 48
function hex(v) 
  local s,l,r=tostr(v,true),3,11
  while(ord(s,l)==48) l+=1
  while(ord(s,r)==48) r-=1
  return sub(s,min(l,6),r>7 and r or 6)
end

> print(hex(123))
7a
> print(hex(15.5))
f.8
> print(hex(3/7))
0.6db6

And here's a slightly-tweaked version that doesn't insist on at least one integer digit:

-- note that ord('0') is 48
function hex(v) 
  local s,l,r=tostr(v,true),3,11
  while(ord(s,l)==48) l+=1
  while(ord(s,r)==48) r-=1
  return sub(s,l<r and l or 6,r>7 and r or 6)
end

> print(hex(3/7))
.6db6

Thanks Felice.

Really nice. I didnt know that (my lua knowledge is pretty weak)...

Guess I will remove some tokens...


It's less about Lua and more about knowing PICO-8's tiny API. It's based on the Lua API, but only some very basic parts of it. It's simplified in some ways, and a few things are a little different.

I find it's helpful to re-read the manual now and then. When I started, I would skim/skip parts of the manual. I either didn't use the functions at the time, or I didn't really understand why they were useful. After you've written for PICO-8 for a while, you start seeing what you need, and what's useful. When you re-read the manual, you find yourself saying, "AH! So that's what that is for!"

People like to say "RTFM!" I think they need to say "RTFMA!" too. :)



[Please log in to post a comment]