数値を unsigned として扱って文字列化

数値を 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 )

うまく出来てるっぽい。もっとスマートな方法を探す。

インフォメーション

公開日時
2007年12月4日 午後5時43分43秒
最終更新日時
2007年12月20日 午後10時33分46秒
カテゴリ
HSP