Witam,
Jak sformatować liczby, aby wyświetlały się w postaci pogrupowanej np. 123 456 789 ?
Nie znalazłem tego na https://pyformat.info , ani na forum.
Pozdrawiam
- Rejestracja:ponad 7 lat
- Ostatnio:około 6 lat
- Postów:9
{:,}
użyje przecinka jako separatora (więc wyświetli 123,456,789
), którego można potem ręcznie zamienić na spację (ale, na bogów, nierozdzielającą — nie ma nic bardziej irytującego, niż liczba przełamana w połowie na końcu linii…).
{:n}
sformatuje wg locale’i, przy czym polskie akurat z jakiegoś powodu nie mają spacji jako separatora, a nie można tego zmieniać w locie, z tego co wiem.
EDYCJA: albo coś się zmieniło, albo ja źle zapamiętałem — bo mi Python 3.7 już elegancko ma spację nierozdzielającą w pl_PL
jako separator.
- Rejestracja:ponad 7 lat
- Ostatnio:około 6 lat
- Postów:9
taki zapis:
print("| {:>5n} | {:.>26n} | {:.>22n} |" .format (i+1,b,c))
dał mi taki wynik:
14 | ......................8192 | .................16383 |
Czyli kropka w {:.} dodała kropki przed cyfrą. Z przecinkiem jest to samo.
Mi nie chodzi o separator kilku liczb, ale rozdzielenie cyfr jednej liczby dla większej czytelności.

- Rejestracja:prawie 8 lat
- Ostatnio:ponad 4 lata
- Lokalizacja:Częstochowa
- Postów:221
Akurat ci się trafiło że coś takiego pisałem dziś na przykład, na innym forum :D.
import textwrap
variable_int = 14819216383 #Twoja liczba
variable_with_spaces = " ".join(digit for digit in textwrap.wrap(str(variable_int)[::-1], 3))[::-1]
print(variable_with_spaces) #14 819 216 383
Inny sposób podziału który nie jest już ciągłym obracaniem napisu, co powinno być szybsze:
>>> variable_int = 14819216383 #Twoja liczba
>>> v = str(variable_int)
>>> i = len(v)
>>> temp = ""
>>> while i > 2:
... temp = " " + v[i-3:i] + temp
... i -= 3
... print(temp)
... else:
... temp = v[0:2] + temp
... print(temp)
...
383
216 383
819 216 383
14 819 216 383
Bez kombinowania, czytelniej: (Jeśli chcesz odstęp co 3 cyfry od końca)
variable_int = 14819216383 #Twoja liczba
print("{:,}".format(variable_int).replace(",", " ")
To ci wrzuci spacje pomiędzy, możesz sobie to ewentualnie podzielić na elementy listy .split()
albo coś innego kombinować :).
Może nie jest to najszybsze rozwiązanie, bo są lepsze - nie jednoliniowe (Nie wiem które z powyższych będzie szybsze, format różnie działa). Ale to zawsze jakiś początek, problem jest w tym, że jeśli byś chciał to zrobić formatem, musiałbyś sobie najpierw to przygotować:
import textwrap
variable_int = 14819216383
variable_divided = "{:,}".format(variable_int).split(",")
your_string = "{:10} {:10} {:10} {:10}".format(*variable_divided)) # Tylko musisz wiedzieć na ile została podzielona, dlatego polecałbym bardziej formatowanego joina.
###
>>> your_string
' 14 819 216 383'
Przykład 'dynamicznego rozmiaru' format/join:
>>> your_string = "{:10}|".join("" for _ in range(len(variable_divided))).format(*variable_divided)
>>> your_string
' 14| 819| 216|'
Twój temp przechowuje na koniec już ładnie sformatowaną liczbę, printy zostawiłem by było widać co się w środku dzieje :D.
I else tam nie potrzebny w sumie, bo nie ma break'a, ale pisałem z palca i mnie poniosło :).
@Edit:
Osobiście i tak bym skorzystał ze sposobu @Althorion, tyle że w taki sposób:
>>> v = 14819216383 #Twoja liczba
>>> list_str_v = "{:,}".format(v).split(",")
>>> list_str_v
['14', '819', '216', '383']
>>> your_string = "{:>10}|".join("" for _ in range(len(list_str_v))).format(*list_str_v)
>>> your_string
' 14| 819| 216|'
Podałeś na początku trochę za mało danych aby kolega wyżej mógł ci prawidłowo udzielić odpowiedzi :)
Łącząc kropki z twoim przykładem:
def convert(v):
return "{:,}".format(v).replace(",", " ")
print("| {:>5n} | {:>26n} | {:>22n} |" .format (convert(i+1),convert(b),convert(c)))
To powinno być tym czego szukasz, ale być może przykłady powyżej też się komuś przydadzą w tym zagadnieniu.
Dodam od siebie, ze warto zapamiętać powyższe informacje, ponieważ kiedyś na rozmowie o prace miałem podobne zadanie:) Co prawda było to zadanie tekstowe, ale sprowadzało się właśnie do znalezienia w ciągu znaków cyfr a potem podzielenie ich na grupy i zwrócenie stringa z tymi grupkami oddzielonymi spacją :)