如何用逗号格式化浮点数作为 f 字符串中的小数点分隔符?
How to format a float with a comma as decimal separator in an f-string?
对于 python 中的某些机器控制,我将结果写入文本文件,其他人可以将其复制到 Excel 中(这是这种情况下最方便的方法)。但是,在荷兰,Excel 有一个逗号作为小数点分隔符,因此我希望文本文件中的结果 "position" 为 123,456,但是当我使用这样的 f-string 方法时:
resultfile.write(f"Position\t{position:.5}")
这显然会导致点小数点分隔符。
如何将其更改为逗号而不遍历整个文件的末尾并将圆点替换为逗号?
一个更简单的解决方案可能是:
f"Position\t{position:,.5f}"
如果您想在 和 f-string 中用逗号 格式化浮点数,您可以在将浮点数转换为字符串后使用替换:
position = 123.456
f"Position\t{str(position).replace('.',',')}"
第二种选择是使用 Python 标准库模块语言环境 (but it is not thread-safe):
import locale
locale.setlocale(locale.LC_ALL, 'nl_NL')
f"Position\t{locale.format('%.3f', position)}"
第三个选项是使用库 babel(在库例程的情况下首选):
from babel.numbers import format_decimal
f"Position\t{format_decimal(position, locale='nl_NL')}"
所有三个选项return给定示例的结果相同:
'Position\t123,456'
如果 g
格式对您来说足够好,请改用 n
:
resultfile.write(f"Position\t{position:.7n}")
虽然 n
有效(使用时使用当前区域设置)而不是 d
和 g
,但没有这样的不幸的是 f
格式...
作为@michel-de-ruiter ,f
格式不适用于语言环境。另一方面,您不能使用 n
格式设置精度。例如,如果您想要小数点后的 4 位数字:
import locale
locale.setlocale(locale.LC_ALL, 'nl_NL')
position = 123.45678999
print(f'{position:.4n}') # output: 123,4 (not quite what we wanted!)
但是,您可以在格式化之前将数字四舍五入为所需的精度:
print(f'{round(position, 4):n}') # output: 123,4567 (that's it!)
如果您希望避免依赖性,以下简单函数可能满足您的需要:
def comma_num(n,f=''):
return ('{'+f+'}').format(n).replace('.',',')
n = 1.23
f'Whatever {comma_num(n)}'
'Whatever {}'.format(comma_num(n))
>>>'Whatever 1,23'
f'Whatever {comma_num(n,":6.4f")}'
'Whatever {}'.format(comma_num(n,':6.4f'))
>>>'Whatever 1,2300'
对于 python 中的某些机器控制,我将结果写入文本文件,其他人可以将其复制到 Excel 中(这是这种情况下最方便的方法)。但是,在荷兰,Excel 有一个逗号作为小数点分隔符,因此我希望文本文件中的结果 "position" 为 123,456,但是当我使用这样的 f-string 方法时:
resultfile.write(f"Position\t{position:.5}")
这显然会导致点小数点分隔符。
如何将其更改为逗号而不遍历整个文件的末尾并将圆点替换为逗号?
一个更简单的解决方案可能是:
f"Position\t{position:,.5f}"
如果您想在 和 f-string 中用逗号 格式化浮点数,您可以在将浮点数转换为字符串后使用替换:
position = 123.456
f"Position\t{str(position).replace('.',',')}"
第二种选择是使用 Python 标准库模块语言环境 (but it is not thread-safe):
import locale
locale.setlocale(locale.LC_ALL, 'nl_NL')
f"Position\t{locale.format('%.3f', position)}"
第三个选项是使用库 babel(在库例程的情况下首选):
from babel.numbers import format_decimal
f"Position\t{format_decimal(position, locale='nl_NL')}"
所有三个选项return给定示例的结果相同:
'Position\t123,456'
如果 g
格式对您来说足够好,请改用 n
:
resultfile.write(f"Position\t{position:.7n}")
虽然 n
有效(使用时使用当前区域设置)而不是 d
和 g
,但没有这样的不幸的是 f
格式...
作为@michel-de-ruiter f
格式不适用于语言环境。另一方面,您不能使用 n
格式设置精度。例如,如果您想要小数点后的 4 位数字:
import locale
locale.setlocale(locale.LC_ALL, 'nl_NL')
position = 123.45678999
print(f'{position:.4n}') # output: 123,4 (not quite what we wanted!)
但是,您可以在格式化之前将数字四舍五入为所需的精度:
print(f'{round(position, 4):n}') # output: 123,4567 (that's it!)
如果您希望避免依赖性,以下简单函数可能满足您的需要:
def comma_num(n,f=''):
return ('{'+f+'}').format(n).replace('.',',')
n = 1.23
f'Whatever {comma_num(n)}'
'Whatever {}'.format(comma_num(n))
>>>'Whatever 1,23'
f'Whatever {comma_num(n,":6.4f")}'
'Whatever {}'.format(comma_num(n,':6.4f'))
>>>'Whatever 1,2300'