liczby z odstępami 100 000

0

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

1

{:,} 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.

0

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.

3

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.

0

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ą :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1