Próbuję wydrukować liczbę całkowitą w Pythonie 2.6.1 z przecinkami jako tysiące separatorów. Na przykład chcę pokazać numer 1234567
jako 1,234,567
. Jak miałbym to zrobić? Widziałem wiele przykładów w Google, ale szukam najprostszego praktycznego sposobu.
Aby wybierać między kropkami a przecinkami, nie musi być zależny od ustawień regionalnych. Wolałbym coś tak prostego, jak to możliwe.
python
number-formatting
Elias Zamaria
źródło
źródło
{val:,}.format(val=val)
f"{2 ** 64 - 1:,}"
Mam to do pracy:
Jasne, nie potrzebujesz wsparcia na rzecz internacjonalizacji, ale jest przejrzysty, zwięzły i korzysta z wbudowanej biblioteki.
PS Ten „% d” jest zwykłym formatyzatorem w stylu%. Możesz mieć tylko jeden formatyzator, ale może to być wszystko, czego potrzebujesz pod względem ustawień szerokości i precyzji pola.
PPS Jeśli nie możesz dostać
locale
do pracy, proponuję zmodyfikowaną wersję odpowiedzi Marka:Rekurencja jest przydatna w przypadku negatywnym, ale jedna rekurencja na przecinek wydaje mi się nieco nadmierna.
źródło
locale
, używam tak mało, jak mogę.setlocale
aby użyć domyślnej, która, mam nadzieję, będzie odpowiednia.Trudno jest pokonać nieefektywność i nieczytelność:
źródło
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))
po prostu zachować motyw zaciemniający.Oto kod grupujący ustawienia regionalne po usunięciu nieistotnych części i drobnym ich oczyszczeniu:
(Poniższe działa tylko dla liczb całkowitych)
Tutaj jest już kilka dobrych odpowiedzi. Chcę tylko dodać to na przyszłość. W Pythonie 2.7 pojawi się specyfikator formatu dla separatora tysięcy. Według dokumentów Pythona działa to tak
W python3.1 możesz zrobić to samo:
źródło
Dziwi mnie, że nikt nie wspomniał, że można to zrobić za pomocą f-stringów w Pythonie 3.6 tak łatwo:
... gdzie część po dwukropku jest specyfikatorem formatu. Przecinek to pożądany znak separatora
f"{num:_}"
zamiast podkreślenia używa podkreślników.Jest to równoważne z używaniem
format(num, ",")
dla starszych wersji Pythona 3.źródło
Oto zamiennik wyrażenia regularnego w jednym wierszu:
Działa tylko w przypadku danych wyjściowych:
Lub w przypadku liczb zmiennoprzecinkowych zawierających mniej niż 4 cyfry zmień specyfikator formatu na
%.3f
:Uwaga: Nie działa poprawnie z więcej niż trzema cyframi dziesiętnymi, ponieważ będzie próbował zgrupować część dziesiętną:
Jak to działa
Rozbijmy to:
źródło
To właśnie robię dla pływaków. Chociaż, szczerze mówiąc, nie jestem pewien, dla których wersji to działa - używam 2.7:
Zwraca: 4 385 893,38
Aktualizacja: Niedawno miałem problem z tym formatem (nie mogłem podać dokładnego powodu), ale mogłem go naprawić, upuszczając
0
:źródło
Możesz także użyć
'{:n}'.format( value )
do reprezentacji ustawień regionalnych. Myślę, że to najprostszy sposób na rozwiązanie regionalne.Aby uzyskać więcej informacji, wyszukaj
thousands
w Python DOC .W przypadku waluty możesz użyć
locale.currency
, ustawiając flagęgrouping
:Kod
Wynik
źródło
Nieznacznie rozszerzając odpowiedź Iana Schneidera:
Jeśli chcesz użyć niestandardowego separatora tysięcy, najprostszym rozwiązaniem jest:
Przykłady
Jeśli chcesz taką reprezentację Niemiec, staje się ona nieco bardziej skomplikowana:
źródło
'{:_.2f}'.format(12345.6789).replace('.', ',').replace('_', '.')
Jestem pewien, że musi istnieć standardowa funkcja biblioteki, ale fajnie było spróbować napisać ją samemu za pomocą rekurencji, więc oto, co wymyśliłem:
Powiedziawszy to, jeśli ktoś inny znajdzie standardowy sposób na zrobienie tego, powinieneś go użyć.
źródło
Od komentarzy do przepisu activestate 498181 Przerobiłem to:
Wykorzystuje funkcję wyrażeń regularnych: lookahead, tj.
(?=\d)
Aby upewnić się, że tylko grupy trzech cyfr, które mają cyfrę „po”, otrzymają przecinek. Mówię „po”, ponieważ w tym momencie ciąg znaków jest odwrotny.[::-1]
po prostu odwraca ciąg.źródło
Przyjęta odpowiedź jest w porządku, ale tak naprawdę wolę
format(number,',')
. Łatwiej jest mi interpretować i pamiętać.https://docs.python.org/3/library/functions.html#format
źródło
Python 3
-
Liczby całkowite (bez miejsc dziesiętnych):
"{:,d}".format(1234567)
-
Liczba zmiennoprzecinkowa (z przecinkiem):
"{:,.2f}".format(1234567)
gdzie liczba poprzednia
f
określa liczbę miejsc dziesiętnych.-
Premia
Szybka i brudna funkcja startowa dla indyjskiego systemu numeracji lakhs / crores (12 34567):
https://stackoverflow.com/a/44832241/4928578
źródło
od wersji Python 2.6 możesz to zrobić:
Dla wersji Pythona <2.6 i tylko dla twojej informacji, oto 2 ręczne rozwiązania, zmieniają liczby zmiennoprzecinkowe na liczby całkowite, ale liczby ujemne działają poprawnie:
kilka rzeczy do zauważenia tutaj:
I bardziej hardkorowa wersja:
źródło
Jestem początkującym w Pythonie, ale doświadczonym programistą. Mam Python 3.5, więc mogę po prostu użyć przecinka, ale jest to jednak interesujące ćwiczenie programistyczne. Rozważ przypadek liczby całkowitej bez znaku. Najbardziej czytelnym programem do dodawania tysięcy separatorów w języku Python jest:
Możliwe jest również użycie listowego zrozumienia:
To jest krótsze i może być jedno-liniowe, ale będziesz musiał zrobić gimnastykę umysłową, aby zrozumieć, dlaczego to działa. W obu przypadkach otrzymujemy:
Pierwsza wersja jest bardziej rozsądnym wyborem, jeśli chcesz, aby program był zrozumiały.
źródło
Oto jeden, który działa również dla pływaków:
Przykład użycia:
źródło
float2comma(12031023.1323)
zwraca: '12, 031,023.132,3 'Jedna linijka dla Python 2.5+ i Python 3 (tylko dodatnie int):
źródło
Uniwersalne rozwiązanie
Znalazłem pewne problemy z separatorem kropek w poprzednich najczęściej głosowanych odpowiedziach. Zaprojektowałem uniwersalne rozwiązanie, w którym możesz użyć, co chcesz, jako separatora tysięcy bez modyfikowania ustawień regionalnych . Wiem, że to nie jest najbardziej eleganckie rozwiązanie, ale wykonuje zadanie. Możesz to poprawić!
źródło
To robi pieniądze wraz z przecinkami
źródło
Mam wersję tego kodu w języku Python 2 i Python 3. Wiem, że pytanie zostało zadane dla Pythona 2, ale teraz (8 lat później) ludzie prawdopodobnie będą używać Pythona 3.
Kod Python 3:
Kod Python 2: (Edytuj. Kod Python 2 nie działa. Myślę, że składnia jest inna).
źródło
Używam Pythona 2.5, więc nie mam dostępu do wbudowanego formatowania.
Spojrzałem na kod Django intcomma (intcomma_recurs w kodzie poniżej) i zdałem sobie sprawę, że jest nieefektywny, ponieważ jest rekurencyjny, a także kompilacja wyrażenia regularnego przy każdym uruchomieniu również nie jest dobrą rzeczą. Nie jest to konieczny „problem”, ponieważ django tak naprawdę nie koncentruje się na tego rodzaju wydajności na niskim poziomie. Spodziewałem się też 10-krotnej różnicy w wydajności, ale jest ona tylko 3-krotnie wolniejsza.
Z ciekawości zaimplementowałem kilka wersji intcomma, aby zobaczyć, jakie są zalety wydajności podczas używania wyrażenia regularnego. Moje dane testowe wskazują na niewielką zaletę tego zadania, ale zaskakująco niewiele.
Z przyjemnością zobaczyłem również to, co podejrzewałem: stosowanie odwrotnego zakresu xrange jest niepotrzebne w przypadku braku wyrażenia regularnego, ale sprawia, że kod wygląda nieco lepiej kosztem ~ 10% wydajności.
Zakładam też, że to, co przekazujesz, to ciąg znaków i wygląda trochę jak liczba. Wyniki nie zostały określone inaczej.
A oto wyniki testu:
źródło
jest to zapieczętowane w Pythonie na PEP -> https://www.python.org/dev/peps/pep-0378/
wystarczy użyć formatu (1000, ', d'), aby wyświetlić liczbę całkowitą z separatorem tysięcy
istnieje więcej formatów opisanych w PEP, miej na to
źródło
Oto inny wariant wykorzystujący funkcję generatora, która działa dla liczb całkowitych:
A oto test:
źródło
Po prostu podklasa
long
(float
lub cokolwiek innego). Jest to bardzo praktyczne, ponieważ w ten sposób nadal możesz używać swoich liczb w operacjach matematycznych (a zatem i istniejącym kodzie), ale wszystkie będą ładnie drukować w twoim terminalu.źródło
__repr__()
poprawna metoda zastąpienia? Sugerowałbym zastąpienie__str__()
i pozostawienie w__repr__()
spokoju, ponieważint(repr(number(928374)))
powinien działać, aleint()
będzie się dusił przecinkami.number(repr(number(928374)))
nie działa, nieint(repr(number(928374)))
. Niemniej jednak, aby to podejście działało bezpośrednioprint
, zgodnie z żądaniem PO,__str__()
metoda powinna być zastąpiona__repr__()
. Niezależnie od tego wydaje się, że w logice wstawiania przecinka występuje błąd.Włochy:
źródło
Dla pływaków:
Dla ints:
źródło
float('1,234.52'.translate(None, ','))
może być prostsze i być może szybsze.