• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python - oddzielanie dużej liczby spacjami

Object Storage Arubacloud
+1 głos
496 wizyt
pytanie zadane 17 lutego 2023 w Python przez blaccli Nowicjusz (180 p.)
Cześć,

potrzebuje żeby liczba w zmiennej została przedstawioną w formacie: XXX XXX XXX (grupy po 3 cyfry maksymalnie, oddzielone pojedynczą spacją)

 

przykład:

wynik = 6874295305

a ma się wyświetlić: 6 874 295 305
komentarz 17 lutego 2023 przez Iei Obywatel (1,950 p.)
Możesz do tego użyć np. regex

3 odpowiedzi

0 głosów
odpowiedź 17 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)
edycja 18 lutego 2023 przez reaktywny
 
Najlepsza

Tu dwie moje wersje (pierwsza nieco rozbudowana jak na Pythona, ale działa OK):

big_num1 = 4365464375675678546785687686478678
big_num2 = 987444365464375675678546785687686478678
big_num3 = 78365464375675678546785687686478678
big_num4 = 75465

# Pierwsza wersja
def big_num_to_str(number: int) -> str:
    num_str = str(number)
    out = list()
    for i, ch in enumerate(num_str[::-1], 1):
        out.append(ch)
        if i % 3 == 0 and i < len(num_str):
            out.append(' ')

    return ''.join(out)[::-1]

# Druga wersja
def big_num_to_str2(number: int) -> str:
    num_str = str(number)
    for i in range(len(num_str)-3, 0, -3):
        num_str = num_str[:i] + ' ' + num_str[i:]

    return num_str

print(big_num_to_str(big_num1))
print(big_num_to_str(big_num2))
print(big_num_to_str(big_num3))
print(big_num_to_str(big_num4))

print(big_num_to_str2(big_num1))
print(big_num_to_str2(big_num2))
print(big_num_to_str2(big_num3))
print(big_num_to_str2(big_num4))

To jest znakomity przykład jak nie należy robić tego w Pythonie :)

@blaccli - zajrzyj do kodu kolegów!

+2 głosów
odpowiedź 17 lutego 2023 przez Benek Szeryf (91,070 p.)
f"{int(wynik):_}".replace("_"," ")

Nie mogę znaleźć prostszego rozwiązania, by zamiast podkreślnika wyświetlało spację.

komentarz 17 lutego 2023 przez blaccli Nowicjusz (180 p.)
dziękuje bardzo
+1 głos
odpowiedź 18 lutego 2023 przez VBService Ekspert (253,420 p.)

Można też użyć metody format(), np.

[ on-line ]

big_num = [
    4365464375675678546785687686478678,
    987444365464375675678546785687686478678,
    78365464375675678546785687686478678,
    75465
]

for num in big_num:
    print('{:,}'.format(num).replace(',', ' '))

podobne w działaniu do tego co zaprezentował @Benek;

komentarz 18 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)
To zdecydowanie najlepsze rozwiązanie, Nie wiem jak działa {:,} - muszę poczytać. Moje jest mocno przekombinowane :)
1
komentarz 18 lutego 2023 przez VBService Ekspert (253,420 p.)

Tak jak napisałem

podobne w działaniu do tego co zaprezentował @Benek;

Zapis f"" został wprowadzony wraz z wersją Pythona 3.6, która została wydana w grudniu 2016 roku. Jest to tzw. f-string (formatted string literal), czyli łańcuch formatowany, który pozwala na osadzanie wartości wyrażeń Python-a bezpośrednio w ciągach znaków za pomocą nawiasów klamrowych {}. Dzięki temu można w łatwy sposób budować łańcuchy znaków zawierające zmienne i wyrażenia Python-a, bez potrzeby używania skomplikowanych metod łączenia ciągów i zmiennych.

[ on-line ]

big_num = [
    4365464375675678546785687686478678,
    987444365464375675678546785687686478678,
    78365464375675678546785687686478678,
    75465
]

for num in big_num:
    print('{:,}'.format(num).replace(',', ' '))
    print(f"{int(num):,}".replace(',', ' '))

 

1
komentarz 18 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)

f-strings znam i korzystam. Nie znam tylko tego kodu formatowania {:,} z dwukropkiem i przecinkiem czy dwukropkiem i podkreśleniem (jak u Benek).

Mój kod - wiecie - jest przeniesiony ze świata Javy ;)

1
komentarz 20 lutego 2023 przez mokrowski Mędrzec (155,460 p.)
edycja 20 lutego 2023 przez mokrowski

A nie lepiej ustawić poprawną lokalizację i po prostu wyświetlić? Zaraz może paść pytanie o formatowanie waluty, daty i innych zależnych od regionu danych

#!/usr/bin/env python3

import locale
import time

locale.setlocale(locale.LC_ALL, 'pl_PL.UTF-8')

big_num = [
    4365464375675678546785687686478678,
    987444365464375675678546785687686478678,
    78365464375675678546785687686478678,
    75465
]

for num in big_num:
    print(f'{num:n}')
    print(locale.currency(num))

print(time.strftime("%A, %d. %B %Y %I:%M%p"))

 

komentarz 20 lutego 2023 przez reaktywny Nałogowiec (41,050 p.)
Tak, ma to sens.
komentarz 20 lutego 2023 przez VBService Ekspert (253,420 p.)
edycja 20 lutego 2023 przez VBService

IMHO bym uważał z tym trochę (w tym kontekście), bo np.

System operacyjny: Linux
Wersja systemu operacyjnego: 5.4.0-1093-gcp
Dodatkowe informacje: #102~18.04.1-Ubuntu SMP Sat Oct 29 06:35:49 UTC 2022
Nazwa architektury sprzętowej: x86_64

mam dla

locale.setlocale(locale.LC_ALL, 'pl_PL.UTF-8')
Traceback (most recent call last):
  File "/home/main.py", line 6, in <module>
    locale.setlocale(locale.LC_ALL, 'pl_PL.UTF-8')
  File "/usr/lib/python3.10/locale.py", line 620, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

 

naprawdę, ten zapis smiley

    print('{:,}'.format(num).replace(',', ' '))

czy ten zapis

    print(f"{int(num):,}".replace(',', ' '))

jest aż tak skomplikowany w "użyciu", żeby podzielić liczbę na bloki po 3 oddzielone spacją.

komentarz 20 lutego 2023 przez mokrowski Mędrzec (155,460 p.)
Proste... to znaczy że masz niedokonfigurowany system. Ten zapis lokalizacji jest zgodny z ISO 639 i normą POSIX. Możesz nie podawać sekcji .UTF-8 lub podać inne kodowanie zgodne z platformą.

Proponuję byś dla platformy ubuntu, zainstalował lokalizację w pełnym wymiarze.

Podobne pytania

0 głosów
1 odpowiedź 366 wizyt
0 głosów
1 odpowiedź 350 wizyt
pytanie zadane 14 października 2022 w Python przez Ichbinda Nowicjusz (230 p.)
0 głosów
4 odpowiedzi 655 wizyt
pytanie zadane 14 kwietnia 2022 w Python przez W1ck Nowicjusz (150 p.)

92,582 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...