2013-07-05 9 views
5

Wie formatieren Sie einfach Zeichenfolge mit Dezimalzahl für zeigen Sie es mit Leerzeichen zwischen jeweils drei Ziffern?Format Zeichenfolge - Leerzeichen zwischen jeder drei Ziffer

ich so etwas wie dies machen:

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

und Ergebnis ist:

'123 456 78,46' 

aber ich will:

'12 345 678,46' 
+0

Was ist ' '12345678,46123''? –

+0

@AshwiniChaudhary: Normalerweise setzen die Leute keine Tausendertrennzeichen nach dem Dezimalpunkt.Mindestens PEP 378 Formatierung tut nicht, und auch keine LC_NUMERIC kann ich ausgraben. – abarnert

+1

Versuchen Sie, Leerzeichen aus dem "Ende" nicht von Anfang an – Zaffy

Antwort

14

Das ist ein bisschen hacky, aber:

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

Wie in einem format_spec in Format specification mini-language, beschrieben:

Das '' Optionssignale die Verwendung eines Komma für ein Tausendertrennzeichen.

Dann ersetzen wir einfach jedes Komma durch ein Leerzeichen, dann den Dezimalpunkt mit einem Komma, und wir sind fertig.

Für komplexere Fälle mit str.format statt format, geht die format_spec nach dem Doppelpunkt, wie in:

'{:,}'.format(12345678.46) 

Siehe PEP 378 für weitere Einzelheiten.


Inzwischen, wenn Sie nur versuchen, die Standard-Gruppierung und Trennzeichen verwenden für locale Ihres Systems gibt es einfachere Wege, dass-das n Formattyp zu tun, oder die locale.format Funktion usw. Zum Beispiel:

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

Wenn Ihr Systemgebietsschema ist, sagen, pl_PL, nur locale.setlocale(locale.LC_NUMERIC) Aufruf (oder locale.setlocale(locale.LC_ALL)) die polnischen Einstellungen aufheben, die Sie wollen, aber die gleiche Person, die Ihr Programm in Australien ausgeführt wird die australischen Einstellungen aufheben, die er möchte.

1

Verwendung:

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

Sie haben regex verwendet, die aus dem Start eine Zeichenfolge beginnt passende. Aber Sie möchten die 3 Zahlen von Ende (vor Komma) gruppieren.

Umkehren Sie die Zeichenfolge vor dem Komma, wenden Sie die gleiche Logik an und kehren Sie sie dann zurück.

5

Ich denke, eine Regex viel schöner wäre:

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

Erläuterung:

\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 für eine Aufschlüsselung der Regex zu machen! – Christoph

Verwandte Themen