如何在 Python 中将浮点数格式化为固定宽度
- 2024-12-13 08:36:00
- admin 原创
- 161
问题描述:
如何将浮点数格式化为固定宽度,并满足以下要求:
如果 n < 1,则为前导零
添加尾随小数点后的零来填充固定宽度
截断超过固定宽度的小数位
对齐所有小数点
例如:
% formatter something like '{:06}'
numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]
for number in numbers:
print formatter.format(number)
输出如下
23.2300
0.1233
1.0000
4.2230
9887.2000
解决方案 1:
numbers = [23.23, 0.1233, 1.0, 4.223, 9887.2]
for x in numbers:
print("{:10.4f}".format(x))
印刷
23.2300
0.1233
1.0000
4.2230
9887.2000
花括号内的格式说明符遵循Python 格式字符串语法。具体来说,在本例中,它由以下部分组成:
冒号前的空字符串表示“将下一个提供的参数带给
format()
”——在本例中x
作为唯一的参数。10.4f
冒号后面的部分是格式规范。f
表示定点符号。这
10
是打印字段的总宽度,左侧用空格填充。是
4
小数点后的位数。
解决方案 2:
这个问题已经有几年没有回答了,但是从 Python 3.6(PEP498)开始,你可以使用新的f-strings
:
numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]
for number in numbers:
print(f'{number:9.4f}')
印刷:
23.2300
0.1233
1.0000
4.2230
9887.2000
解决方案 3:
在python3中,以下工作正常:
>>> v=10.4
>>> print('% 6.2f' % v)
10.40
>>> print('% 12.1f' % v)
10.4
>>> print('%012.1f' % v)
0000000010.4
解决方案 4:
使用f 字符串文字:
>>> number = 12.34
>>> print(f"{number}")
12.34
>>> print(f"{number:10f}")
12.340000
>>> print(f"{number:10.4f}")
12.3400
10.4f
冒号后面是:
格式说明,其中10为整数(包括空格)的字符宽度,第二个数字4为小数点后的位数,f
代表浮点数。
也可以使用变量,而不是硬编码宽度和小数位数:
>>> number = 12.34
>>> width = 10
>>> decimals = 4
>>> print(f"{number:{width}.{decimals}f}")
12.3400
解决方案 5:
您也可以在左侧用零填充。例如,如果您希望number
长度为 9 个字符,则在左侧用零填充,使用:
print('{:09.3f}'.format(number))
因此,如果number = 4.656
,输出为:00004.656
对于您的示例,输出将如下所示:
numbers = [23.2300, 0.1233, 1.0000, 4.2230, 9887.2000]
for x in numbers:
print('{:010.4f}'.format(x))
印刷:
00023.2300
00000.1233
00001.0000
00004.2230
09887.2000
举个例子,当你想正确地按字母顺序列出文件名时,这个功能可能会很有用。我注意到在某些 Linux 系统中,数字是:1,10,11,..2,20,21,...
因此,如果您想强制文件名中必要的数字顺序,则需要在左侧填充适当数量的零。
解决方案 6:
请参阅 Python 3.x格式字符串语法:
IDLE 3.5.1
numbers = ['23.23', '.1233', '1', '4.223', '9887.2']
for x in numbers:
print('{0: >#016.4f}'. format(float(x)))
23.2300
0.1233
1.0000
4.2230
9887.2000
解决方案 7:
这将打印76.66
:
print("Number: ", f"{76.663254: .2f}")
解决方案 8:
在 Python 3 中。
GPA = 2.5
print(" %6.1f " % GPA)
6.1f
意思是说,如果在点后打印 2 位数字,则在点后显示 1 位数字,而只应%6.2f
在%6.3f
点后打印 3 位数字。
解决方案 9:
这是使用 f 字符串格式化浮点数的摘要,带有填充和对齐,以及带/不带浮点数“f”指示符。
>>> f"{0.12}"
'0.12'
>>> f"{0.12:.4}"
'0.12'
>>> f"{0.12:.4f}"
'0.1200'
固定宽度(有或无填充)
>>> f"{0.12:8.4}"
' 0.12'
>>> f"{0.12:8.4f}"
' 0.1200'
>>> f"{0.12:08.4}"
'00000.12'
>>> f"{0.12:08.4f}"
'000.1200'
左对齐
>>> f"{0.12:<8.4}"
'0.12 '
>>> f"{0.12:<8.4f}"
'0.1200 '
>>> f"{0.12:<08.4}"
'0.120000'
>>> f"{0.12:<08.4f}"
'0.120000'
居中对齐
>>> f"{0.12:^8.4}"
' 0.12 '
>>> f"{0.12:^8.4f}"
' 0.1200 '
>>> f"{0.12:^08.4}"
'000.1200'
>>> f"{0.12:^08.4f}"
'00.12000'
解决方案 10:
我需要类似的东西来处理数组。这帮助了我
some_array_rounded=np.around(some_array, 5)
解决方案 11:
请注意,如果数字仍然很大,这里的大多数答案可以返回比指示宽度更长的字符串。
如果您确实需要结果字符串正好是特定数量的字符,例如,因为您想要在表格或其他字符数至关重要的上下文中以固定宽度的字体显示它,我认为没有内置的函数可以实现这一点。可以使用自定义函数切换到科学计数法以节省空间,即如下所示:
def fpstr(n, width, sign=''):
n = float(n)
attempts = []
def v(s):
if len(s) != width:
return
try:
float(s)
except Exception:
return
attempts.append(s)
for w in reversed(range(width)):
v("{:{}0.0{}f}".format(n, sign, w))
for w in reversed(range(width)):
v("{:{}0.0{}g}".format(n, sign, w))
for w in reversed(range(width)):
v("{:{}{}g}".format(n, sign, w).rjust(width))
for w in reversed(range(width)):
v("{:{}.{}e}".format(n, sign, w).rjust(width))
if not attempts:
return "#" * width
best_attempt = attempts[0]
for attempt in attempts[1:]:
if abs(n - float(attempt)) < abs(n - float(best_attempt)):
best_attempt = attempt
return best_attempt
(这是一个草稿,因此将其保留为社区维基,以便将来进行改进。)
解决方案 12:
总销售额=1000
print ("\r总销售额为:"+ f"{float(totalSales):,.2f}")
输出:
总销售额为:1,000.00
:,将数字格式化为以逗号作为千位分隔符。
.2f确保数字格式化为小数点后两位数字。
解决方案 13:
我尝试了所有的选项
pd.options.display.float_format = '{:.4f}'.format
pd.set_option('display.float_format', str)
pd.set_option('display.float_format', lambda x: f'%.{len(str(x%1))-2}f' % x)
pd.set_option('display.float_format', lambda x: '%.3f' % x)
但对我没什么用。
因此,在将变量/值(var1
)分配给变量(例如num1
)时,我使用了round(val,5)
类似
num1 = round(var1,5)
这是一种粗暴的方法,因为您必须在每次分配中使用此轮函数。但这可以确保您控制其发生的方式并获得您想要的结果。