【问题标题】:python format string thousand separator with spacespython格式字符串千位分隔符,带空格
【发布时间】:2013-05-16 05:27:25
【问题描述】:

对于带有千位分隔符的打印数字, 可以使用python格式字符串:

'{:,}'.format(1234567890)

但是我怎样才能指定我想要一个用于千位分隔符的空间呢?

【问题讨论】:

    标签: python string-formatting


    【解决方案1】:

    如果你不想惹locale,这是一个糟糕但简单的解决方案:

    '{:,}'.format(1234567890.001).replace(',', ' ')
    

    【讨论】:

    • 这有什么不好?
    • @kasimir 这很老套。但 7 年后,我认为情况并没有那么糟糕。
    【解决方案2】:

    @user136036 的答案相当不错,但遗憾的是它没有考虑到 Python 错误的现实。完整答案可能如下:

    变体 A

    如果您平台的区域设置正常,则只需使用区域设置:

    import locale
    locale.setlocale(locale.LC_ALL, '')
    print("{:,d}".format(7123001))
    

    结果取决于您的语言环境和 Python 实现是否正常工作。

    但是如果根据语言环境的 Python 格式被破坏了,例如Linux 上的 Python 3.5?

    变体 B

    如果 Python 不尊重 grouping=True 参数,您可以使用语言环境和解决方法(使用货币格式):

    locale.setlocale(locale.LC_ALL, '')
    locale._override_localeconv = {'mon_thousands_sep': '.'}
    print(locale.format('%.2f', 12345.678, grouping=True, monetary=True))
    

    以上在我的平台上给出了 12.345,68。将货币设置为 False 或忽略它 - Python 不会对数千进行分组。 指定 locale._override_localeconv = {'thousands_sep': '.'} 什么都不做。

    变体 C

    如果您没有时间检查平台上哪些工作正常以及 Python 有哪些问题,您可以使用常规字符串替换功能(如果您想将逗号和点交换为点和逗号):

    print("{:,.2f}".format(7123001.345).replace(",", "X").replace(".", ",").replace("X", "."))

    用逗号替换空格很简单(点是小数分隔符):

    print("{:,.2f}".format(7123001.345).replace(",", " ")

    【讨论】:

    • '{:,d}'.format 不依赖于语言环境。您可能会将其与 '{:n}'.format 混淆。
    • 在 macOS 上,您可能必须指定确切的语言环境,因为它不会拉取操作系统默认设置。例如:locale.setlocale(locale.LC_ALL, 'sv_SE.UTF-8')
    【解决方案3】:

    这会将语言环境设置为您的默认操作系统位置:

    import locale
    locale.setlocale(locale.LC_ALL, '')
    

    那么你可以使用:

    "{0:n}".format(1234567890)
    

    【讨论】:

      【解决方案4】:

      您必须改用'n' 可识别区域设置的数字格式,并改用set your locale 以使用空格作为千​​位分隔符的格式。是的,这很痛苦。

      'n' - 号码。这与'd' 相同,只是它使用当前区域设置来插入适当的数字分隔符。

      【讨论】:

      • " 索引 1 处不支持的格式字符 'n' (0x6e)"。可能,这仅适用于 Python 3?
      • @Vanuan:你用的是什么版本的 Python?我用 2.6 和 2.7 对此进行了测试; 2.5 及以上版本没有 str.format().
      • @Vanuan: 还是你使用% 字符串格式?在任何 Python 版本中,这种类型的字符串格式都不支持n
      • 这仅适用于整数。我正在寻找浮点数的解决方案。
      【解决方案5】:

      假设您编写代码:

      print(f'{name} | Yearly salary: ${salary}.')
      

      打印 -> 凯特 |年薪:60000美元。

      先放一个 , 分隔符:

      print(f'{name} | Yearly salary: ${salary:,}.')
      

      打印 -> 凯特 |年薪:60,000 美元。

      然后用空格替换逗号:

      print(f'{name} | Yearly salary: {salary:,} USD.'.replace(',', ' '))
      

      打印 -> 凯特 |年薪:60 000 美元。

      注意:记住 USD、$ 或 £、kroner 等符号应与通用标准相匹配

      【讨论】:

        【解决方案6】:

        如果你不想使用本地,一个适用于各种大小字符串的解决方案:

            def format_number(string):
                j = len(string) % 3
                substrings = [string[3 * i + j:3 * (i + 1) + j] for i in                                         range(len(string)//3)]
                if j != 0:
                    substrings.insert(0, string[:j])
                return " ".join(substrings)
        

        【讨论】:

          【解决方案7】:

          Python 社区在PEP 378 下定义了它,您可以在其中看到主要提案包含format() 函数。因此,通过遵循该建议,我建议使用以下内容:

          format(1234567890, ',d').replace(',',' ')
          

          【讨论】:

            猜你喜欢
            • 2018-05-11
            • 1970-01-01
            • 2023-03-03
            • 2014-01-13
            • 2018-06-22
            • 2022-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多