Как преобразовать целое число в любой базе в строку? - PullRequest
177 голосов
/ 15 февраля 2010

Python позволяет легко создавать целое число из строки заданной базы с помощью

int(str, base). 

Я хочу выполнить обратное: создание строки из целого числа , т.е.нужна некоторая функция int2base(num, base), такая, что:

int(int2base(x, b), b) == x

Порядок имени / аргумента функции не важен.

Для любого числа x и основания b, которое int() примет.

Это простая функция для написания: на самом деле это проще, чем описать ее в этом вопросе.Однако я чувствую, что, должно быть, чего-то не хватает.

Я знаю о функциях bin, oct, hex, но я не могу использовать их по нескольким причинам:

  • Эти функции недоступнына старых версиях Python, с которыми мне нужна совместимость с (2.2)

  • Я хочу общее решение, которое можно назвать одинаково для разных баз

  • Я хочу разрешить основания, отличные от 2, 8, 16

Связанные

Ответы [ 24 ]

0 голосов
/ 09 декабря 2016

Вот рекурсивная версия, которая обрабатывает целые числа со знаком и пользовательские цифры.

import string

def base_convert(x, base, digits=None):
    """Convert integer `x` from base 10 to base `base` using `digits` characters as digits.
    If `digits` is omitted, it will use decimal digits + lowercase letters + uppercase letters.
    """
    digits = digits or (string.digits + string.ascii_letters)
    assert 2 <= base <= len(digits), "Unsupported base: {}".format(base)
    if x == 0:
        return digits[0]
    sign = '-' if x < 0 else ''
    x = abs(x)
    first_digits = base_convert(x // base, base, digits).lstrip(digits[0])
    return sign + first_digits + digits[x % base]
0 голосов
/ 19 мая 2016

Другое решение, работает с базами от 2 до 10, нуждается в модификации для более высоких баз:

def n2b(n, b):
    if n == 0:
        return 0
    d = []
    while n:
        d.append(int(n % b))
        n /= b
    return ''.join(map(str,d[::-1]))

Пример:

n2b(10,2) => '10100'
int(n2b(10,2),2) => 10
0 голосов
/ 26 января 2016

Еще один короткий (и более легкий для понимания imo):

def int_to_str(n, b, symbols='0123456789abcdefghijklmnopqrstuvwxyz'):
    return (int_to_str(n/b, b, symbols) if n >= b else "") + symbols[n%b]

И с правильной обработкой исключений:

def int_to_str(n, b, symbols='0123456789abcdefghijklmnopqrstuvwxyz'):
    try:
        return (int_to_str(n/b, b) if n >= b else "") + symbols[n%b]
    except IndexError:
        raise ValueError(
            "The symbols provided are not enough to represent this number in "
            "this base")
0 голосов
/ 23 января 2016
def baseConverter(x, b):
    s = ""
    d = string.printable.upper()
    while x > 0:
        s += d[x%b]
        x = x / b
    return s[::-1]
...