Комбинируйте фиксированную и локальную нотацию для форматирования строк

Я пытаюсь определить строку формата, используя формат строки Python. мини-язык, чтобы получить строку с числом в фиксированной записи, но с локальным десятичным разделителем. См. следующий фрагмент для дальнейшего разъяснения желаемого результата:

import locale
import os

if os.name == 'nt':
    locale.setlocale(locale.LC_ALL, 'de-de')    
else:
    locale.setlocale(locale.LC_ALL, 'de_de')

number = 1.234567
print('fixed notation:   {:.7f}'.format(number))
print('general notation: {:.7g}'.format(number))
print('local format:     {:.7n}'.format(number))

desired_output = '{:.7f}'.format(number)
print('desired output:   {}'.format(desired_output.replace('.', ',')))

Замена . на , является подходящим решением при использовании «обычных» строк. Однако в моем случае это кажется невыполнимым, поскольку мне нужно указать matplotlib.ticker.StrMethodFormatter чтобы получить желаемый результат в виде галочек. Использование нотации локали работает так, как ожидалось:

ax.yaxis.set_major_formatter(ticker.StrMethodFormatter('{x:1.3n}'))

К сожалению, мне не удалось найти строку формата для комбинированного формата фиксированного (например, {:.3f}) и обозначения локали ({:.3n}), чтобы разрешить заполнение нулей в конце для одинаковой десятичной длины.

Как вы можете видеть на моей примерной диаграмме, они должны иметь как одинаковое количество десятичных разрядов (что может быть обеспечено записью с фиксированной точкой '{:.7f}'), так и локальный десятичный разделитель (что может быть обеспечено '{:.7n}'):

введите здесь описание изображения


person albert    schedule 24.07.2018    source источник
comment
Я не думаю, что это возможно сделать с format (если только вы не можете передавать экземпляры подкласса float, который переопределяет __format__, что вы, вероятно, не можете, если matplotlib создает числа под прикрытием…).   -  person abarnert    schedule 24.07.2018


Ответы (1)


Если у вас есть функция, которая возвращает строку в нужном формате, вы можете использовать эту функцию для форматирования меток с помощью файла FuncFormatter. В этом случае,

func = lambda x,pos: '{:.7f}'.format(x).replace('.', ',')
ax.yaxis.set_major_formatter(mticker.FuncFormatter(func))

Это, конечно, не зависит от локали.

Я не знаю, возможно ли использовать локаль с мини-языком форматирования, но тот же подход, описанный выше, можно расширить для использования фактической локали.

func2 = lambda x,pos: locale.format('%.7f', x, grouping = True)

В обоих случаях результат должен быть похожим и что-то вроде

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 24.07.2018
comment
Использование func2 для FuncFormatter() прекрасно работает. - person albert; 25.07.2018