Introduzione
Quando si parla di gestione avanzata delle stringhe in Python, spesso si pensa subito a slicing, regex o f-string. Un aspetto molto utile, pratico e spesso sottovalutato è invece l’uso dei format specifiers, cioè le specifiche di formattazione che permettono di controllare con precisione come un valore viene convertito in testo.
Questa tecnica è fondamentale quando devi generare report, log leggibili, tabelle testuali, esportazioni CSV ben formattate o messaggi utente coerenti. Con i format specifiers puoi allineare il testo, definire la precisione dei numeri, aggiungere zeri iniziali, gestire percentuali, separatori delle migliaia e molto altro.
In questo tutorial vedremo un caso pratico: costruire un piccolo report testuale di vendita con stringhe ben formattate. L’obiettivo non è solo “stampare dati”, ma farli apparire chiari, ordinati e professionali.
Codice completo
from dataclasses import dataclass
from typing import List
@dataclass
class ProdottoVenduto:
nome: str
quantita: int
prezzo_unitario: float
def formatta_valuta(valore: float) -> str:
# Formatta un numero come valuta con 2 decimali e separatore delle migliaia
return f"€ {valore:,.2f}"
def genera_riga_prodotto(prodotto: ProdottoVenduto) -> str:
totale = prodotto.quantita * prodotto.prezzo_unitario
#:
# <20 = allineamento a sinistra in uno spazio di 20 caratteri
# >6 = allineamento a destra in uno spazio di 6 caratteri
# >10,.2f = numero con separatore delle migliaia e 2 decimali
return (
f"{prodotto.nome:<20}"
f"{prodotto.quantita:>6}"
f"{prodotto.prezzo_unitario:>10,.2f}"
f"{totale:>12,.2f}"
)
def genera_report(vendite: List[ProdottoVenduto]) -> str:
intestazione = (
f"{´PRODOTTO´:<20}"
f"{´QTA´:>6}"
f"{´PREZZO´:>10}"
f"{´TOTALE´:>12}"
)
separatore = "-" * 48
righe = [intestazione, separatore]
totale_generale = 0.0
for prodotto in vendite:
righe.append(genera_riga_prodotto(prodotto))
totale_generale += prodotto.quantita * prodotto.prezzo_unitario
righe.append(separatore)
righe.append(f"{´TOTALE GENERALE´:<20}{´´:>6}{´´:>10}{totale_generale:>12,.2f}")
return "n".join(righe)
def demo() -> None:
vendite = [
ProdottoVenduto("Tastiera meccanica", 3, 89.9),
ProdottoVenduto("Mouse wireless", 12, 24.5),
ProdottoVenduto("Monitor 27 pollici", 2, 219.99),
ProdottoVenduto("Hub USB-C", 7, 18.75),
]
print("Report vendite")
print(genera_report(vendite))
print()
print("Esempio di formattazione singola:")
importo = 1250.5
sconto = 0.1575
codice = 42
print(f"Importo: {formatta_valuta(importo)}")
print(f"Sconto: {sconto:.1%}")
print(f"Codice ordine: {codice:05d}")
if __name__ == "__main__":
demo() Spiegazione
Il cuore di questo esempio è la sintassi di formattazione dentro le stringhe, in particolare all’interno delle f-string. La forma generale è:
{valore:formato} La parte dopo i due punti definisce come il valore deve essere presentato.
1. Allineamento del testo
Nei report tabellari è importante che le colonne siano ordinate. Per questo usiamo:
- < per allineare a sinistra
- > per allineare a destra
- ^ per centrare il contenuto
Per esempio, {prodotto.nome:<20} stampa il nome del prodotto in uno spazio di 20 caratteri, lasciandolo allineato a sinistra. È perfetto per colonne di testo.
2. Larghezza fissa
Specificare una larghezza, come 20 o 12, aiuta a mantenere il layout stabile. Anche se i valori cambiano, la struttura del report resta leggibile.
3. Numeri con decimali e separatori delle migliaia
La formattazione {valore:,.2f} è molto utile per importi economici:
- , aggiunge il separatore delle migliaia
- .2f mostra sempre due cifre decimali
Così 1250.5 diventa 1,250.50. Questo rende i numeri più facili da leggere, soprattutto in report finanziari o commerciali.
4. Formattazione percentuale
La sintassi {sconto:.1%} converte un numero decimale in percentuale. Per esempio, 0.1575 diventa 15.8%. Python moltiplica automaticamente per 100 e aggiunge il simbolo %.
5. Zeri iniziali
La formattazione {codice:05d} è utile per codici numerici, ID o progressivi. Significa:
- 0: riempi con zeri
- 5: larghezza totale 5
- d: intero decimale
Quindi 42 diventa 00042.
6. Costruzione del report
La funzione genera_report() crea una lista di righe, aggiunge intestazione, separatore, righe prodotto e totale finale. Alla fine usa "n".join(righe) per comporre il testo finale. Questo approccio è pulito e scalabile, perché separa la logica di formattazione dalla composizione del documento.
Best practice
- Usa le f-string per casi moderni e leggibili: sono concise e facili da mantenere.
- Definisci larghezze coerenti nei report testuali, così le colonne restano allineate anche con dati diversi.
- Formatta i numeri in base al contesto: valuta con due decimali, percentuali con precisione adeguata, codici con zeri iniziali.
- Evita di mescolare logica e presentazione: meglio creare funzioni dedicate come formatta_valuta() o genera_riga_prodotto().
- Attenzione alla localizzazione: il separatore delle migliaia e il simbolo decimale possono cambiare in base al paese. Per applicazioni internazionali, valuta librerie o soluzioni di internazionalizzazione.
- Usa nomi chiari per le funzioni di formattazione, così il codice resta comprensibile anche dopo mesi.
Riepilogo
I format specifiers sono uno strumento molto potente per la gestione avanzata delle stringhe in Python. Ti permettono di controllare con precisione l’aspetto dei dati testuali, trasformando valori grezzi in output professionali e facili da leggere.
In questo tutorial hai visto come:
- allineare testo e numeri in colonne ordinate
- formattare importi con separatori delle migliaia e decimali
- convertire valori in percentuali
- generare codici con zeri iniziali
- costruire un report testuale pulito e riutilizzabile
Questa competenza è utile in moltissimi contesti reali: log applicativi, dashboard testuali, esportazioni dati, script di automazione e reportistica interna.
Approfondisci con risorse ufficiali
- Python documentation - Format String Syntax: documentazione ufficiale sulla sintassi di formattazione.
- Python documentation - string.Formatter: utile per capire il meccanismo di formattazione a livello più generale.
- PEP 498: introduce le f-string in Python.
- PEP 3101: descrive il sistema di formattazione avanzata delle stringhe.
Se vuoi, posso anche scrivere un secondo tutorial sullo stesso tema ma più orientato a date, numeri e valuta con localizzazione, oppure uno dedicato alla creazione di report tabellari professionali.
