格式字符串 - 每三位数之间的空格

时间:2013-07-05 08:39:49

标签: python

如何简单地格式化带有十进制数字的字符串以显示每三位数之间的空格?

我可以做这样的事情:

some_result = '12345678,46'
' '.join(re.findall('...?', test[:test.find(',')]))+test[test.find(','):]

结果是:

'123 456 78,46'

但我想:

'12 345 678,46'

3 个答案:

答案 0 :(得分:14)

这有点hacky,但是:

format(12345678.46, ',').replace(',', ' ').replace('.', ',')

Format specification mini-language中所述,格式规范:

  

','选项表示使用逗号分隔千位分隔符。

然后我们只用空格替换每个逗号,然后用逗号替换小数点,我们就完成了。

对于使用str.format而不是format的更复杂的情况,format_spec在冒号之后,如:

'{:,}'.format(12345678.46)

有关详细信息,请参阅PEP 378


同时,如果您只是尝试使用标准分组和分隔符作为系统的语言环境,那么有更简单的方法 - n格式类型或locale.format函数等例如:

>>> locale.setlocale(locale.LC_NUMERIC, 'pl_PL')
>>> format(12345678, 'n')
12 345 678
>>> locale.format('%.2f' 12345678.12, grouping=True)
12 345 678,46
>>> locale.setlocale(locale.LC_NUMERIC, 'fr_FR')
>>> locale.format('%.2f' 12345678.12, grouping=True)
12345678,46
>>> locale.setlocale(locale.LC_ALL, 'en_AU')
>>> locale.format('%.2f' 12345678.12, grouping=True)
12,345,678.46

如果您的系统区域设置是pl_PL,只需拨打locale.setlocale(locale.LC_NUMERIC)(或locale.setlocale(locale.LC_ALL))即可选择您想要的波兰语设置,但是同一个人在运行您的程序澳大利亚将接受他想要的澳大利亚环境。

答案 1 :(得分:5)

我认为正则表达式会更好:

>>> import re
>>> some_result = '12345678,46'
>>> re.sub(r"\B(?=(?:\d{3})+,)", " ", some_result)
'12 345 678,46'

<强>解释

\B       # Assert that we're not at the start of a number
(?=      # Assert that the following regex could match from here:
 (?:     # The following non-capturing group
  \d{3}  # which contains three digits
 )+      # and can be matched one or more times
 ,       # until a comma follows.
)        # End of lookahead assertion

答案 2 :(得分:1)

使用:

' '.join(re.findall('...?',test[:test.find(',')][::-1]))[::-1]+test[test.find(','):]

您已使用正则表达式开始匹配开始中的字符串。但是您想要对结束(逗号之前)中的3个数字进行分组。

所以在逗号之前反转字符串,应用相同的逻辑然后将其反转。