String format - Help!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ElastischerHosenbund
User
Beiträge: 12
Registriert: Donnerstag 22. Juli 2021, 22:52

Hallo zusammen!

ich hänge gerade an einem Formatierungsproblem fest:
Ich habe die Variablen:
id
name
menge
gewicht
preis

Diese sollen sich zu folgendem String zusammenfügen:

Code: Alles auswählen

{id}.	{name}	{menge}ml/{gewicht}g	{preis}€
Also z.B.

Code: Alles auswählen

1.	Wasser	1000.00ml/1000.00g	2.50€
Also ein Art tabellarisches Layout wenn man das so sagen kann.
Mein Problem ist nun, dass wenn sich die zeichenlänge der einzelnen Variablen unterscheidet, sich alles im String verschiebt.
z.B.

Code: Alles auswählen

2.	Ananasschorle 10.00ml/10.00g 30.50€ 

Jede Variable bräuchte also eine fest definierte Länge innerhalb des Strings. Ist sie zu lang, soll sie einfach bei Zeichen x abgeschnitten/gerundet werden. Leerzeichen müssten bei zu kurzen Variablen aufgefüllt werden, damit der Abstand immer gleich bleibt. So zumindest meine Überlegung. Nur wie bekomme ich das hin?

Ich habe schon alles mögliche mit String format/fString versucht aber will es einfach nicht klappen. Kann mir da jemand weiterhelfen?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also das mit dem Abschneiden wird schwierig alleine mit Formatstrings. Da würde ich dann so etwas wie das `rich`-Modul empfehlen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
ElastischerHosenbund
User
Beiträge: 12
Registriert: Donnerstag 22. Juli 2021, 22:52

Das Modul muss ich mir mal ansehen.

Meine IDee wäre sonst noch gewesen, im Vorfeld die länge der Variable mittels Slicing zu begrenzen.. Haut aber auch nich so richtig hin
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

suchst du sowas:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    width = 5
    for num in range(5,12): 
        for base in 'dXob':
            print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')
        print()

if __name__ == "__main__":
    main()

?

Quelle: https://docs.python.org/3/library/string.html

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Zahlen abzuschneiden ist immer ein Problem, weil damit das Ergebnis ziemlich falsch werden kann. Da mußt Du einfach genug Platz einplanen. Strings zu beschneiden ist dagegen ziemlich simple.

Code: Alles auswählen

f"{id:3d}. {name:10.10s} {f'{menge:8.2f}ml/{gewicht:.2f}g':20s} {preis:8.2f}€"
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei auch Zeichenketten beschneiden das Ergebnis verfälschen kann wenn man nicht erkennen kann ob die Zeichenkette vollständig ist, oder abgekürzt wurde.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
ElastischerHosenbund
User
Beiträge: 12
Registriert: Donnerstag 22. Juli 2021, 22:52

Habe es eben nochmal mit der Vorlage von Sirius3 versucht.
Noch zwei Tabs mit eingefügt und nun klappts soweit.

Einziges Problem machen noch Namen, wenn sie komplett in Großbuchstaben sind. Aber naja WER SCHREIBT DENN AUCH SO. ^^
Zur Not wird einfach alles vorher in Kleinbuchstaben zwangs-konvertiert. :D
Für meinen Einsatzzweck genügt mir das aber vorerst.

Danke für Eure Hilfe!
Antworten