如何制作那个f“...”字符串格式使用逗号而不是点作为小数分隔符?

How to make that f"..." string formatting uses comma instead of dot as decimal separator?

提问人:Basj 提问时间:1/10/2023 最后编辑:Basj 更新时间:3/24/2023 访问量:711

问:

我试过了:

import locale
print(locale.locale_alias)
locale.setlocale(locale.LC_ALL, '')
locale.setlocale(locale.LC_NUMERIC, "french")
print(f"{3.14:.2f}")

但输出是而我想要.3.143,14

如何使用 f“...”字符串格式?

注意:我不想使用.replace(".", ",")

注意:我正在寻找 Windows 解决方案,以及如何在 f 字符串中用逗号格式化浮点数作为小数分隔符的解决方案? 不起作用(因此它在 Windows 上不是重复的):

locale.setlocale(locale.LC_ALL, 'nl_NL')
# or
locale.setlocale(locale.LC_ALL, 'fr_FR')

现场。错误:不支持的区域设置设置

Python Windows 浮点 十进制 区域设置

评论

1赞 Basj 1/10/2023
@matszwecja 不,我使用的是 Windows,这些方法开箱即用。
1赞 matszwecja 1/10/2023
我刚刚测试过,接受答案中的所有 3 种方法在 Windows 上对我来说都很好
1赞 Cow 1/10/2023
如果我使用您的代码并更改为我得到答案之一中的描述。print(f"{3.14:.2f}")print(f"{3.14:.3n}")3,14
0赞 Basj 1/10/2023
@user56700 你是对的。我想你可以把它作为答案发布。
0赞 Basj 1/10/2023
@matszwecja 就我而言,它不起作用,但它确实有效.3f.3n

答:

4赞 Cow 1/10/2023 #1

我在重复标记的页面上查找了答案,并找到了一个有效的答案:

更改为,您将得到结果:print(f"{3.14:.2f}")print(f"{3.14:.3n}")3,14

请参见 https://docs.python.org/3/library/string.html#format-specification-mini-language

'n'数。这与“g”相同,只是它使用当前区域设置插入适当的数字分隔符。

鉴于在以下位置描述:'g'

g常规格式。对于给定的精度 p >= 1,这会将数字四舍五入为 p 位有效数字,然后根据其大小以定点格式或科学记数法格式化结果。精度 0 被视为等同于精度 1。 ...截断。。。

描述是:'f'

'f'定点符号。对于给定精度 p,将数字格式化为十进制数,小数点后正好是 p 位数字。

评论

1赞 Basj 1/10/2023
奇怪的是,在 之后打印 2 位数字,但在 之后只有 1 位数字。为什么?.2f..2n,
1赞 Cow 1/10/2023
@Basj 您复制了整数表示法描述,而它应该是浮点数描述。我已经更新了答案。顺便说一句,感谢您添加链接等。 四舍五入最后一位数字,这就是为什么你需要 3。n
1赞 venkat sai 1/10/2023 #2

您可以使用“locale.format_string”而不是“f string”

试试这个:

import locale
# Set the locale to "french"
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
# Format the number 3.14 with 2 decimal places, using the french locale
print(locale.format_string("%.2f", 3.14, grouping=True))
1赞 Andj 3/24/2023 #3

问题之后已经过去了一段时间,但我会添加一个答案以供将来参考。

正如其他答案所指出的,将自动选取您的区域设置(这是其目的之一),但精度数字的工作方式与您预期的不同。3.14:.2n 表示您想要 2 位数字。这不是指数字中的小数位数,而是指总数。因此,如有必要,小数位将向下舍入。n

f用于控制十进制精度,但不支持区域设置格式。要以区分语言环境的方式使用符号,必须使用 function 格式化数字:flocale.format_string()

import locale
locale.setlocale(locale.LC_NUMERIC, "fr_FR.UTF-8")
print(f"{3.14:.3n}")
# 3,14
print(f"{3.14:.2n}")
# 3,1
print(f"{3.14:.1n}")
# 3
print(locale.format_string("%.2f", 3.14))
# 3,14

如果您想使用格式化程序,并且仍然需要十进制精度,那么 round() 函数是一个选项。n

print(f'{round(3.14, 2):n}')
# 3,14