数値を unsigned として扱って文字列化したい! たとえば -1 を 16 進数で表すと ffffffff になるような。文字列で足し算する関数を作ってそれを使う方法を考えてみました。
#module
#defcfunc digit_from_val int _x, local x
x = _x
if( x < 0 ) {
return ""
}
if( x < 10 ) {
return strf("%c",'0'+x)
}
x -= 10
if( x < 26 ) {
return strf("%c",'a'+x)
}
return ""
#defcfunc val_from_digit_charcode int x
if( ( x >= '0' ) && ( x <= '9' ) ) {
return x - '0'
}
if( ( x >= 'a' ) && ( x <= 'z' ) ) {
return x - 'a' + 10
}
if( ( x >= 'A' ) && ( x <= 'Z' ) ) {
return x - 'A' + 10
}
return 0
#defcfunc str_add str _x, str _y, int radix, local val, local xval, local yval, local kuri, local xindex, local yindex, local dest, local x, local y
x = _x : y = _y
dest = ""
xindex = strlen( x ) - 1
yindex = strlen( y ) - 1
kuri = 0
while( ( xindex >= 0 ) || ( yindex >= 0 ) || ( kuri != 0 ) )
xval = 0
yval = 0
if( xindex >= 0 ) : xval = val_from_digit_charcode( peek( x, xindex ) )
if( yindex >= 0 ) : yval = val_from_digit_charcode( peek( y, yindex ) )
val = xval + yval + kuri
kuri = val / radix
val = val \ radix
dest = digit_from_val( val ) + dest
xindex --
yindex --
wend
return dest
#defcfunc _str_from_int int _x, int radix, local x, local dest
x = _x
dest = ""
do
dest = digit_from_val( abs( x \ radix ) ) + dest
x /= radix
until x == 0
return dest
#defcfunc str_from_int int x, int radix, local dest
dest = _str_from_int( x & 0x7fffffff, radix )
if( x < 0 ) {
dest = str_add( dest, _str_from_int( 0x80000000, radix ), radix )
}
return dest
#global
mes str_from_int( 0, 10 )
mes str_from_int( 0x123abc, 16 )
mes str_from_int( 12345, 10 )
mes str_from_int( 0b101101, 2 )
mes str_from_int( -1, 16 )
mes str_from_int( -1, 10 )
mes str_from_int( -1, 8 )
mes str_from_int( -1, 2 )
うまく出来てるっぽい。もっとスマートな方法を探す。