2013-07-05 5 views
5

Как простая строка формата с десятичным числом для отображения ее пробелов между каждыми тремя цифрами?Формат строки - пробелы между каждыми тремя цифрами

я могу сделать что-то вроде этого:

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

и результат есть:

'123 456 78,46' 

, но я хочу:

'12 345 678,46' 
+0

насчет ' '12345678,46123''? –

+0

@AshwiniChaudhary: Обычно люди не ставят разделители тысяч после десятичной точки.По крайней мере, форматирование PEP 378 не работает, и ни один LC_NUMERIC я не могу выкопать. – abarnert

+1

Попробуйте сделать пробелы с 'end' не с начала – Zaffy

ответ

14

Это немного 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)) подберут польские настройки, которые вы хотите, но тот же человек работает вашу программу в Австралии подберет Австралию настройки, он хочет.

1

Использование:

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

Вы использовали регулярное выражение, которое начинается соответствие строки из начала. Но вы хотите сгруппировать 3 числа из конец (перед запятой).

Поэтому переверните строку перед запятой, примените ту же логику и затем отмените ее.

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 
+0

+1 для обеспечения разбивки регулярного выражения! – Christoph

Смежные вопросы