5

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

我可以做这样的事情:

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

结果是:

'123 456 78,46'

但我想要:

'12 345 678,46'
4

3 回答 3

15

这有点hacky,但是:

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

Format specification mini-language中所述,在 format_spec 中:

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

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

对于使用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)) 将获取您想要的波兰语设置,但在澳大利亚运行您的程序的同一个人将获取他想要的澳大利亚设置。

于 2013-07-05T08:42:00.010 回答
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
于 2013-07-05T09:26:16.170 回答
1

利用:

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

您使用了从start开始匹配字符串的正则表达式。但是您想从最后(逗号之前)开始对 3 个数字进行分组。

因此,在逗号之前反转字符串,应用相同的逻辑,然后将其反转回来。

于 2013-07-05T09:13:49.127 回答