Ich versuche, eine Ganzzahl in Python 2.6.1 mit Kommas als Tausendertrennzeichen zu drucken . Zum Beispiel möchte ich die Nummer 1234567
als anzeigen 1,234,567
. Wie würde ich das machen? Ich habe viele Beispiele bei Google gesehen, suche aber nach dem einfachsten praktischen Weg.
Es muss nicht länderspezifisch sein, um zwischen Punkten und Kommas zu entscheiden. Ich würde etwas so Einfaches wie vernünftig bevorzugen.
python
number-formatting
Elias Zamaria
quelle
quelle
{val:,}.format(val=val)
f"{2 ** 64 - 1:,}"
Ich habe das zum Laufen gebracht:
Sicher, die Sie nicht brauchen Unterstützung für Internationalisierung, aber es ist klar, präzise und verwendet eine integrierte Bibliothek.
PS Das "% d" ist der übliche Formatierer im% -Stil. Sie können nur einen Formatierer haben, aber es kann alles sein, was Sie in Bezug auf Feldbreite und Präzisionseinstellungen benötigen.
PPS Wenn Sie nicht bekommen können
locale
zur Arbeit kommen können, würde ich eine modifizierte Version von Marks Antwort vorschlagen:Rekursion ist nützlich für den negativen Fall, aber eine Rekursion pro Komma scheint mir etwas übertrieben.
quelle
locale
verwende ich so wenig wie ich kann.setlocale
, um die Standardeinstellung zu verwenden, die hoffentlich angemessen ist.Für Ineffizienz und Unlesbarkeit ist es schwer zu schlagen:
quelle
lambda x: (lambda s: ','.join(["%s%s%s" % (x[0], x[1] or '', x[2] or '') for x in itertools.izip_longest(s[::-1][::3], s[::-1][1::3], s[::-1][2::3])])[::-1].replace('-,','-'))(str(x))
nur um das Verschleierungsthema beizubehalten.Hier ist der Gruppierungscode für das Gebietsschema, nachdem irrelevante Teile entfernt und ein wenig aufgeräumt wurden:
(Das Folgende funktioniert nur für ganze Zahlen)
Hier gibt es bereits einige gute Antworten. Ich möchte dies nur zum späteren Nachschlagen hinzufügen. In Python 2.7 wird es einen Formatbezeichner für das Tausendertrennzeichen geben. Laut Python-Dokumenten funktioniert es so
In python3.1 können Sie dasselbe wie folgt tun:
quelle
Ich bin überrascht, dass niemand erwähnt hat, dass Sie dies mit f-Strings in Python 3.6 so einfach machen können:
... wobei der Teil nach dem Doppelpunkt der Formatbezeichner ist. Das Komma ist das gewünschte Trennzeichen
f"{num:_}"
verwendet also Unterstriche anstelle eines Kommas.Dies entspricht der Verwendung
format(num, ",")
für ältere Versionen von Python 3.quelle
Hier ist ein einzeiliger Regex-Ersatz:
Funktioniert nur für integrierte Ausgaben:
Oder ändern Sie für Floats mit weniger als 4 Ziffern den Formatbezeichner in
%.3f
:NB: Funktioniert nicht korrekt mit mehr als drei Dezimalstellen, da versucht wird, den Dezimalteil zu gruppieren:
Wie es funktioniert
Lassen Sie es uns zusammenfassen:
quelle
Das mache ich für Schwimmer. Obwohl ich ehrlich gesagt nicht sicher bin, für welche Versionen es funktioniert - ich verwende 2.7:
Rückgabe: 4.385.893,38
Update: Ich hatte kürzlich ein Problem mit diesem Format (ich konnte Ihnen den genauen Grund nicht nennen), konnte es jedoch beheben, indem ich das löschte
0
:quelle
Sie können auch verwenden
'{:n}'.format( value )
eine Gebietsschemadarstellung verwenden. Ich denke, dies ist der einfachste Weg für eine Gebietsschema-Lösung.Weitere Informationen finden Sie
thousands
in Python DOC .Für die Währung können Sie
locale.currency
das Flag setzengrouping
:Code
Ausgabe
quelle
Die Antwort von Ian Schneider leicht erweitern:
Wenn Sie ein benutzerdefiniertes Tausendertrennzeichen verwenden möchten, ist die einfachste Lösung:
Beispiele
Wenn Sie die deutsche Darstellung so wollen, wird es etwas komplizierter:
quelle
'{:_.2f}'.format(12345.6789).replace('.', ',').replace('_', '.')
Ich bin mir sicher, dass es dafür eine Standardbibliotheksfunktion geben muss, aber es hat Spaß gemacht, sie selbst mithilfe der Rekursion zu schreiben. Deshalb habe ich mir Folgendes ausgedacht:
Wenn jedoch jemand anderes einen Standardweg findet, sollten Sie diesen stattdessen verwenden.
quelle
Aus den Kommentaren zum Aktivierungsrezept 498181 habe ich Folgendes überarbeitet:
Es verwendet die Funktion für reguläre Ausdrücke: Lookahead, dh
(?=\d)
um sicherzustellen, dass nur Gruppen mit drei Ziffern, die eine Ziffer 'nach' haben, ein Komma erhalten. Ich sage 'nach', weil die Zeichenfolge an dieser Stelle umgekehrt ist.[::-1]
kehrt einfach eine Zeichenfolge um.quelle
Die akzeptierte Antwort ist in Ordnung, aber ich bevorzuge es tatsächlich
format(number,',')
. Für mich leichter zu interpretieren und zu erinnern.https://docs.python.org/3/library/functions.html#format
quelle
Python 3
- -
Ganzzahlen (ohne Dezimalzahl):
"{:,d}".format(1234567)
- -
Floats (mit Dezimalzahl):
"{:,.2f}".format(1234567)
Dabei
f
gibt die vorherige Zahl die Anzahl der Dezimalstellen an.- -
Bonus
Schnellstartfunktion für das indische Lakhs / Crores-Nummerierungssystem (12,34,567):
https://stackoverflow.com/a/44832241/4928578
quelle
Ab Python Version 2.6 können Sie dies tun:
Für Python-Versionen <2.6 und nur zu Ihrer Information, hier sind 2 manuelle Lösungen, die Floats in Ints umwandeln, aber negative Zahlen funktionieren korrekt:
Einige Dinge, die hier zu beachten sind:
Und eine Hardcore-Version:
quelle
Ich bin ein Python-Anfänger, aber ein erfahrener Programmierer. Ich habe Python 3.5, daher kann ich nur das Komma verwenden, aber dies ist dennoch eine interessante Programmierübung. Betrachten Sie den Fall einer vorzeichenlosen Ganzzahl. Das am besten lesbare Python-Programm zum Hinzufügen von Tausenden Trennzeichen scheint zu sein:
Es ist auch möglich, ein Listenverständnis zu verwenden:
Dies ist kürzer und könnte ein Einzeiler sein, aber Sie müssen einige mentale Gymnastik machen, um zu verstehen, warum es funktioniert. In beiden Fällen erhalten wir:
Die erste Version ist die sinnvollere Wahl, wenn Sie möchten, dass das Programm verstanden wird.
quelle
Hier ist eine, die auch für Schwimmer funktioniert:
Anwendungsbeispiel:
quelle
float2comma(12031023.1323)
Rückgabe: '12, 031,023.132,3 'Ein Liner für Python 2.5+ und Python 3 (nur positiv int):
quelle
Universelle Lösung
Ich habe einige Probleme mit dem Punkttrennzeichen in den vorherigen Antworten gefunden. Ich habe eine universelle Lösung entwickelt, bei der Sie alles, was Sie wollen, als Tausendertrennzeichen verwenden können, ohne das Gebietsschema zu ändern . Ich weiß, dass es nicht die eleganteste Lösung ist, aber es erledigt den Job. Fühlen Sie sich frei, es zu verbessern!
quelle
Dies macht Geld zusammen mit den Kommas
quelle
Ich habe eine Python 2 und Python 3 Version dieses Codes. Ich weiß, dass die Frage für Python 2 gestellt wurde, aber jetzt (8 Jahre später lol) werden die Leute wahrscheinlich Python 3 verwenden.
Python 3-Code:
Python 2-Code: (Bearbeiten. Der Python 2-Code funktioniert nicht. Ich denke, dass die Syntax anders ist.)
quelle
Ich verwende Python 2.5, daher habe ich keinen Zugriff auf die integrierte Formatierung.
Ich habe mir den Django-Code intcomma (intcomma_recurs im Code unten) angesehen und festgestellt, dass er ineffizient ist, da er rekursiv ist und es auch nicht gut ist, den regulären Ausdruck bei jedem Lauf zu kompilieren. Dies ist kein notwendiges Problem, da Django sich nicht wirklich auf diese Art von Leistung auf niedrigem Niveau konzentriert. Außerdem hatte ich einen Faktor von 10 Leistungsunterschieden erwartet, aber es ist nur dreimal langsamer.
Aus Neugier habe ich einige Versionen von intcomma implementiert, um zu sehen, welche Leistungsvorteile bei der Verwendung von Regex bestehen. Meine Testdaten schließen einen kleinen Vorteil für diese Aufgabe, aber überraschenderweise überhaupt nicht viel.
Ich war auch erfreut zu sehen, was ich vermutete: Die Verwendung des umgekehrten xrange-Ansatzes ist im Fall ohne Regex nicht erforderlich, lässt den Code jedoch bei Kosten von ~ 10% Leistung etwas besser aussehen.
Außerdem gehe ich davon aus, dass das, was Sie übergeben, eine Zeichenfolge ist und etwas wie eine Zahl aussieht. Ergebnisse ansonsten unbestimmt.
Und hier sind die Testergebnisse:
quelle
Dies wird per PEP in Python gebacken -> https://www.python.org/dev/peps/pep-0378/
Verwenden Sie einfach das Format (1000, ', d'), um eine Ganzzahl mit Tausendertrennzeichen anzuzeigen
Es gibt weitere Formate, die im PEP beschrieben sind
quelle
Hier ist eine andere Variante, die eine Generatorfunktion verwendet, die für ganze Zahlen funktioniert:
Und hier ist ein Test:
quelle
Nur Unterklasse
long
(oderfloat
oder was auch immer). Dies ist sehr praktisch, da Sie auf diese Weise Ihre Zahlen weiterhin in Matheoperationen (und damit in vorhandenem Code) verwenden können, sie jedoch alle in Ihrem Terminal gut gedruckt werden.quelle
__repr__()
die richtige Methode zum Überschreiben? Ich würde vorschlagen , außer Kraft zu setzen__str__()
und in__repr__()
Ruhe zu lassen, weilint(repr(number(928374)))
es funktionieren sollte, aberint()
an den Kommas ersticken wird.number(repr(number(928374)))
nicht funktioniert, nichtint(repr(number(928374)))
. Damit dieser Ansatz direkt mitprint
dem OP funktioniert , sollte die__str__()
Methode eher überschrieben als überschrieben werden__repr__()
. Unabhängig davon scheint es einen Fehler in der Logik zum Einfügen von Kommas zu geben.Italien:
quelle
Für Schwimmer:
Für Ints:
quelle
float('1,234.52'.translate(None, ','))
könnte so etwas einfacher und möglicherweise schneller sein.