如何在 Python 中将浮点数格式化为固定宽度

2024-12-13 08:36:00
admin
原创
161
摘要:问题描述:如何将浮点数格式化为固定宽度,并满足以下要求:如果 n < 1,则为前导零添加尾随小数点后的零来填充固定宽度截断超过固定宽度的小数位对齐所有小数点例如:% formatter something like '{:06}' numbers = [23.23, 0.123334987, 1, 4....

问题描述:

如何将浮点数格式化为固定宽度,并满足以下要求:

  1. 如果 n < 1,则为前导零

  2. 添加尾随小数点后的零来填充固定宽度

  3. 截断超过固定宽度的小数位

  4. 对齐所有小数点

例如:

% 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:

我尝试了所有的选项

  1. pd.options.display.float_format = '{:.4f}'.format

  2. pd.set_option('display.float_format', str)

  3. pd.set_option('display.float_format', lambda x: f'%.{len(str(x%1))-2}f' % x)

  4. pd.set_option('display.float_format', lambda x: '%.3f' % x)

但对我没什么用。

因此,在将变量/值(var1)分配给变量(例如num1)时,我使用了round(val,5)类似

num1 = round(var1,5)

这是一种粗暴的方法,因为您必须在每次分配中使用此轮函数。但这可以确保您控制其发生的方式并获得您想要的结果。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用