home changes contents help options

174:2進、8進、10進、16進の各表現を相互に変換

文字列から数値型へ

int 関数の第1引数に「数値と解釈できる文字列」を、第2引数に基数を与えます。基数は 36 まで受け付けます。

>>> int("1010", 2)
10
>>> int("12", 8)
10
>>> int("10", 10)
10
>>> int("a", 16)
10
>>> int("20", 5)
10

第2引数を省略すると基数に 10 を指定したものとみなされます。

>>> int("10")
10

第1引数を「整数リテラルとおなじ書式の文字列」、第2引数を 0 とすると int 関数は基数を推測しつつ変換します。

>>> int("010", 0)
8
>>> int("0x10", 0)
16

数値型からへ文字列へ

数値を 10進数表記の文字列に変換するのは str 関数で問題ありません。

>>> str(10)
'10'

数値を 8進数、16進数表記の文字列に変換するには 文字列フォーマット操作 で %o, %x を用います。

>>> '%o' % 10
'12'
>>> '%x' % 10
'a'

数値を 8進数、16進数表記の整数リテラル風に変換するにはそれぞれ oct, hex 関数を用います。

>>> oct(10)
'012'
>>> hex(10)
'0xa'

10, 8, 16 以外の基数に対応するにはすこしだけコードを書く必要がありそうです。

int2str_table = '0123456789abcdefghijklmnopqrstuvwxyz'

def int2str(i, base):
    u"""
    数値型を文字列に変換する。
    i      数値
    base   基数 (2から36の間の値)
    """
    if not 2 <= base <= 36:
        raise ValueError('base must be 2 <= base < 36')

    result = []

    temp = abs(i)
    if temp == 0:
        result.append('0')
    else:
        while temp > 0:
            result.append(int2str_table[temp % base])
            temp /= base

    if i < 0:
        result.append('-')

    return ''.join(reversed(result))

assert len(int2str_table) == 36
for i in range(36):
    if i < 10:
        assert str(i) == int2str_table[i]
    else:
        assert chr(ord('a') + i - 10) == int2str_table[i]
>>> int2str(10, 2)
'1010'
>>> int2str(10, 8)
'12'
>>> int2str(10, 16)
'a'
>>> int2str(10, 5)
'20'

文字列から文字列へ

いったん数値に直してから文字列へ再変換します。

>>> s8 = '12' # 8進数
>>> i = int(s8, 8) # 数値型へ
>>> s16 = '%x' % i # 16進数
>>> s16
'a'

Python 3000

Python 3.0 では 2進整数リテラルが追加、そして8進整数リテラルの接頭辞に変更が加わります。 2進リテラルは 0b1010 のように 0b を付与します。 8進リテラルは 0 ではなく 0o を付与します。

その影響で 2進整数リテラル風の文字列への変換関数 bin が追加されます。 oct の変換結果も 0o から始まるようになります。

>>> bin(10)
'0b1010'
>>> oct(10)
'0o12'