Мы делаем дополнительный транслятор цифр любой системы счисления в любые символы и встраиваем его в функцию преобразования вещественных чисел
>>> import re
>>>
>>> def translate_base_digits(number):
... digits_map = {
... '(10)': 'a', '(11)': 'b', '(12)': 'c',
... '(13)': 'd', '(14)': 'e', '(15)': 'f',
... '(16)': 'g', '(17)': 'h', '(18)': 'i',
... '(19)': 'j', '(20)': 'k', '(21)': 'l',
... '(22)': 'm', '(23)': 'n', '(24)': 'o',
... '(25)': 'p', '(26)': 'q', '(27)': 'r',
... '(28)': 's', '(29)': 't', '(30)': 'u',
... '(31)': 'v', '(32)': 'w', '(33)': 'x',
... '(34)': 'y', '(35)': 'z',
... }
... def trans(digit):
... return digits_map.get(digit, digit)
... out = re.sub(r'\(\d+\)', lambda mo: trans(mo.group()), number)
... return out
...
>>> def decimal_fraction_to_base(number, base):
... out = None
... if isinstance(number, int):
... out = decimal_to_base(abs(number), base)
... if number < 0:
... out = '-' + out
... elif isinstance(number, float):
... parts = str(number).partition('.')
... ipart = int(parts[0].strip('-'))
... fpart = int(parts[-1])
... oipart = decimal_to_base(ipart, base)
... ofpart = decimal_to_base(fpart, base)
... out = oipart + '.' + ofpart
... if number < 0:
... out = '-' + out
... out = translate_base_digits(out)
... return out
...
>>> from numbase import decimal_to_base
>>>
>>> decimal_fraction_to_base(12345.255, 36)
'9ix.73'
>>> decimal_fraction_to_base(12345.255, 16)
'3039.ff'
>>> decimal_fraction_to_base(-12345, 16)
'-3039'
>>> decimal_fraction_to_base(-12345, 36)
'-9ix'
>>> decimal_fraction_to_base(-12345.255, 16)
'-3039.ff'
>>> decimal_fraction_to_base(-12345.255, 36)
'-9ix.73'
>>>
В идеале, у тебя должны быть отдельные функции, в которые подаются данные, поступающие из других функций или передающиеся напрямую. Здесь же транслятор цифр фиксирует данные (какие цифры в какие буквы) внутри функции, тогда как в идеале маппинг должен передаваться в функцию снаружи, чтобы можно было его дополнить в любой момент или видоизменить (сделать больше букв всяких, поменять регистр букв и так далее).
Почему нельзя сделать всё с самого начала на буквах? Потому что букв самих по себе немного, а базовая функция работает с
любыми системами счисления (это математический подход, в котором системы счисления не ограничены какой либо базой).
В твоём случае надо ограничить систему счисления 36-ю, а где-то понадобится система счисления 1000, поэтому в ней никаких букв не хватит. Вот поэтому в общей функции используются скобки с числами, а всё остальное становится частными случаями и реализуется каждый раз по-своему.