结合使用固定格式和区域设置符号进行字符串格式化

时间:2018-07-24 16:29:18

标签: python matplotlib numbers string-formatting fixed-point

我正在尝试使用Python's string format mini-language定义格式字符串,以获取具有固定符号的数字但具有局部小数点分隔符的字符串。请参见以下代码片段,以进一步了解所需的输出:

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}'确保)和局部小数分隔符(可以通过{{1}确保) }):

enter image description here

1 个答案:

答案 0 :(得分: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)

在两种情况下,结果都应该相似,并且类似

enter image description here