我正在尝试使用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}确保) }):
答案 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)
在两种情况下,结果都应该相似,并且类似