【问题标题】:How to format a float with a comma as decimal separator in an f-string?如何用逗号格式化浮点数作为 f 字符串中的小数分隔符?
【发布时间】:2019-03-27 14:30:10
【问题描述】:

对于 python 中的某些机器控制,我将结果写入文本文件,其他人可以将其复制到 Excel 中(这是这种情况下最方便的方法)。但是,在荷兰,Excel 有一个逗号作为小数分隔符,因此我希望文本文件中的结果“位置”为 123,456,但是当我使用这样的 f-string 方法时:

    resultfile.write(f"Position\t{position:.5}")

这显然会产生一个点小数分隔符。

如何在不遍历整个文件的情况下将其更改为逗号并将点替换为逗号?

【问题讨论】:

  • 一个 fstring 只是一个字符串,所以 f"Position\t{position:.5}".replace('.', ',') 应该可以正常工作,对吧?
  • 另外:stackoverflow.com/a/6633912/962190 这个答案谈到了一个不同的问题(以逗号分隔的每三个小数位打印数字),但区域设置也可能会影响您的格式。

标签: python floating-point format f-string


【解决方案1】:

如果你想用逗号 f-字符串中格式化浮点数,你可以在将浮点数转换为字符串后使用replace:

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')}"

对于给定的示例,所有三个选项都返回相同的结果:

'Position\t123,456'

【讨论】:

    【解决方案2】:

    作为@michel-de-ruiter mentionedf 格式不适用于语言环境。另一方面,您不能使用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!)
    

    【讨论】:

      【解决方案3】:

      如果您希望避免依赖,下面的简单函数可能会满足您的需求:

      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'
      

      【讨论】:

        【解决方案4】:

        如果g 格式对您来说足够好,请改用n

        resultfile.write(f"Position\t{position:.7n}")
        

        虽然n 工作(使用时使用当前区域设置)而不是d g,但不幸的是f 格式没有这样的东西......

        【讨论】:

          【解决方案5】:

          一个更简单的解决方案可能是:

          f"Position\t{position:,.5f}"
          

          【讨论】:

          • 这会将千位分隔符更改为,,但问题是关于小数分隔符。它根本没有回答这个问题。
          • @seaver 这确实回答了这个问题。所有这些都引入了千位分隔符 (,)。它更改小数点分隔符(保持.)。
          猜你喜欢
          • 2019-12-30
          • 2016-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-28
          相关资源
          最近更新 更多