1242 Stimmen

Wie man eine Zahl mit Kommas als Tausendertrennzeichen druckt

Wie drucke ich eine Ganzzahl mit Kommas als Tausendertrennzeichen?

1234567      1.234.567

Es muss nicht standortspezifisch sein, um zwischen Punkten und Kommas zu entscheiden.

0 Stimmen

Dies ist eine schreckliche Idee, verwenden Sie niemals ',' noch '.' als Dezimaltrennzeichen.

2462voto

Ian Schneider Punkte 21770

Lokal-agnostisch: Verwenden Sie _ als Tausendertrennzeichen

f'{value:_}'          # Für Python 3.6

Englischer Stil: Verwenden Sie , als Tausendertrennzeichen

'{:,}'.format(value)  # Für Python 2.7
f'{value:,}'          # Für Python 3.6

Lokalbewusst

import locale
locale.setlocale(locale.LC_ALL, '')  # Verwenden Sie '' für automatisch oder erzwingen Sie z.B. 'en_US.UTF-8'

'{:n}'.format(value)  # Für Python 2.7
f'{value:n}'          # Für Python 3.6

Referenz

Gemäß Format Specification Mini-Language,

Die Option ',' signalisiert die Verwendung eines Kommas als Tausendertrennzeichen. Für ein ortsabhängiges Trennzeichen verwenden Sie stattdessen den Typ 'n' für Ganzzahlen-Präsentationen.

und:

Die Option '_' signalisiert die Verwendung eines Unterstrichs als Tausendertrennzeichen für Fließkommazahlen-Präsentationen und für den Ganzzahlen-Präsentationstyp 'd'. Für die Ganzzahlen-Präsentationstypen 'b', 'o', 'x' und 'X' werden Unterstriche alle 4 Stellen eingefügt.

34 Stimmen

Bitte beachten Sie, dass dies außerhalb der USA und einigen anderen Orten nicht korrekt ist. In diesem Fall ist die gewählte locale.format() die richtige Antwort.

1 Stimmen

Ist es auch möglich, den % Operator zu verwenden?

15 Stimmen

Das Schlüsselargument-Formular: {val:,}.format(val=val)

378voto

Emil Stenström Punkte 11959

Es überrascht mich, dass niemand erwähnt hat, dass Sie dies mit f-Strings in Python 3.6+ genauso einfach tun können:

>>> num = 10000000
>>> print(f"{num:,}")
10.000.000

... wobei der Teil nach dem Doppelpunkt der Formatangabe ist. Das Komma ist das Trennzeichen, das Sie verwenden möchten, daher verwendet f"{num:_}" Unterstriche anstelle eines Kommas. Mit dieser Methode können nur "," und "_" verwendet werden.

Dies entspricht der Verwendung von format(num, ",") für ältere Versionen von Python 3.

Das mag magisch aussehen, wenn Sie es zum ersten Mal sehen, ist es aber nicht. Es ist nur Teil der Sprache und etwas, das häufig genug benötigt wird, um eine Abkürzung verfügbar zu haben. Um mehr darüber zu erfahren, werfen Sie einen Blick auf die Gruppen-Subkomponente.

15 Stimmen

Das ist einfacher als jede der höher bewerteten Antworten und erfordert keine zusätzlichen Imports.

0 Stimmen

@Z4-Tier Dies liegt wahrscheinlich daran, dass nicht viele Menschen überhaupt wissen, dass f-Strings existieren oder was sie sind.

1 Stimmen

@NoName Diese Antwort erwähnt auch, wie man es mit str.format() macht, was auf allen Versionen von python3 funktioniert, fast genauso einfach ist und keine f-Strings verwendet.

317voto

Mike DeSimone Punkte 39876

Ich habe das zum Laufen gebracht:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US')
'en_US'
>>> locale.format_string("%d", 1255000, grouping=True)
'1,255,000'

Sicher, du brauchst keine Unterstützung für Internationalisierung, aber es ist klar, prägnant und verwendet eine eingebaute Bibliothek.

P.S. Das "%d" ist der übliche %-Style-Formatter. Du kannst nur einen Formatter haben, aber er kann alles sein, was du in Bezug auf Feldbreite und Genauigkeitseinstellungen benötigst.

P.P.S. Wenn du locale nicht zum Laufen bekommst, würde ich eine modifizierte Version von Marks Antwort vorschlagen:

def intWithCommas(x):
    if type(x) not in [type(0), type(0L)]:
        raise TypeError("Parameter muss eine ganze Zahl sein.")
    if x < 0:
        return '-' + intWithCommas(-x)
    result = ''
    while x >= 1000:
        x, r = divmod(x, 1000)
        result = ",%03d%s" % (r, result)
    return "%d%s" % (x, result)

Rekursion ist nützlich für den negativen Fall, aber eine Rekursion pro Komma erscheint mir etwas übertrieben.

P.P.P.S. Ältere Pythons verwendeten format anstelle von format_string.

15 Stimmen

Ich habe deinen Code ausprobiert und leider erhalte ich Folgendes: "locale.Error: unsupported locale setting". :-s

0 Stimmen

Ich habe immer die Verwendung der Lokalisierungs-Bibliothek als nicht intuitiv und etwas komplex empfunden. Jedes Mal, wenn ich sie verwenden muss, muss ich nachschauen. Ich kann mich nicht auf Anhieb daran erinnern, wie es geht.

12 Stimmen

Mark: Wenn Sie auf Linux sind, möchten Sie vielleicht prüfen, was in Ihrer /etc/locale.gen steht oder was auch immer Ihr glibc verwendet, um seine Lokalisierungen zu erstellen. Sie könnten auch versuchen ""en", "en_US.utf8", "en_US.UTF-8", 'en_UK" (sp?), usw. Mikez: Es muss ein Buch geben: "Dr. PEP: Oder wie ich lernte, aufzuhören, mir Sorgen zu machen und docs.python.org zu lieben." Ich habe aufgehört, alle Bibliotheken um Python 1.5.6 herum auswendig zu lernen. Was die locale betrifft, verwende ich so wenig wie möglich davon.

174voto

Kasey Kirkham Punkte 1647

Für Ineffizienz und Unlesbarkeit ist es schwer zu schlagen:

>>> import itertools
>>> s = '-1234567'
>>> ','.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('-,','-')

231 Stimmen

Wurde für die ineffizienteste und am schwersten lesbare Methode zur Beantwortung dieser Frage hochgestuft.

3 Stimmen

Es wäre schön, wenn dies zumindest funktionieren würde. Probieren Sie diese Nummer "17371830" aus, sie wird zu "173.718.3.0" =)

7 Stimmen

Perioden? Das ist nicht einmal möglich, Kumpel. Dieses Stück Schrott ignoriert völlig die Lokalisierung. Ich frage mich, wie du dieses Ergebnis bekommen hast. Dein Beispiel ergibt bei mir '17,371,830', wie erwartet.

125voto

Nadia Alramli Punkte 105256

Hier ist der Ländercode nach Entfernen irrelevanter Teile und einer kleinen Bereinigung:

(Das Folgende funktioniert nur für ganze Zahlen)

def gruppe(nummer):
    s = '%d' % nummer
    gruppen = []
    while s and s[-1].isdigit():
        gruppen.append(s[-3:])
        s = s[:-3]
    return s + ','.join(reversed(gruppen))

>>> gruppe(-23432432434.34)
'-23,432,432,434'

Es gibt bereits einige gute Antworten hier. Ich möchte dies nur für zukünftige Referenzen hinzufügen. In Python 2.7 wird es einen Formatierungsspezifikator für Tausendertrennzeichen geben. Laut Python-Dokumentation funktioniert es so:

>>> '{:20,.2f}'.format(f)
'18,446,744,073,709,551,616.00'

In Python 3.1 können Sie dasselbe wie folgt tun:

>>> format(1234567, ',d')
'1,234,567'

0 Stimmen

Ja, die schwierigeren Wege sind hauptsächlich für Leute auf älteren Pythons gedacht, wie sie beispielsweise in RHEL und anderen Langzeit-Support-Distributionen enthalten sind.

3 Stimmen

Wie kann man dies mit Formatzeichenfolgen ausdrücken? "%,d" % 1234567 funktioniert nicht.

0 Stimmen

Für mich hat diese Antwort {:15,d}'.format(len(SortedList)) perfekt funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X