Tracce
/
C#
C#
/
Programma
/
Formattazione di stringhe
Fo

Formattazione di stringhe in C#

13 esercizi

Informazioni su Formattazione di stringhe

I meccanismi per formattare le stringhe in C#/.NET sono molti e vari: dalla semplice concatenazione di oggetti alle chiamate al metodo object.ToString() sovrascritto, fino all'uso di ICustomFormatter (non trattato in questo esercizio).

I due meccanismi più comuni per formattare le stringhe sono l'interpolazione di stringhe e String.Format(). La classe StringBuilder (cross-ref-tba) può essere usata anche per costruire una stringa quando c'è una certa complessità, ad esempio quando sono coinvolte più righe.

Usare ToString()

System.Object(), da cui ereditano tutte le classi e le struct, ha un metodo ToString(). Per esempio, new DateTime(2019, 5, 23).ToString() produce «05/23/2019 00:00:00» (su un thread con cultura statunitense, vedi sotto). Ci sono situazioni, come la concatenazione di stringhe, in cui questo metodo ToString() predefinito può essere invocato in modo implicito: "" + new DateTime(2019, 5, 23) dà lo stesso risultato.

Oltre al metodo ToString() predefinito, i tipi per cui la formattazione è un problema hanno degli overload che accettano una stringa di formato o persino un provider di formato. In particolare, nella BCL (Base Class Library) si tratta di numeri, date, enumerazioni e GUID.

Formattazione composita

String.Format() prende una stringa (chiamata nella documentazione formato composito) composta da testo fisso e segnaposto (noti nella documentazione come elementi di formato) e un numero variabile di argomenti. Il valore restituito risolve ogni elemento di formato usando l'argomento corrispondente e combina i valori risolti con il testo fisso.

string.Format("I had {0} bitcoins on {1}, the day I forgot my password.", 55.5, new DateTime(2010, 2, 25))
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Format() può essere una scelta migliore dell'interpolazione quando il formato viene usato in più espressioni come una sorta di modello, oppure quando incorporare il formato e le espressioni da formattare è troppo macchinoso, come nel caso delle [stringhe verbatim][verbatim-strings].

Questo meccanismo è tecnicamente noto come formattazione composita.

Un elenco più completo dei metodi che producono stringhe e sfruttano la formattazione composita si trova in questo articolo.

Interpolazione di stringhe

Le stringhe interpolate hanno il prefisso $ e contengono espressioni valutate a runtime racchiuse tra parentesi graffe. L'elemento di formato ha la seguente sintassi: $"{<interpolationExpression>[,<alignment>][:<formatString>]}". Eliminano la necessità di un elenco separato di argomenti. Il risultato è funzionalmente equivalente al meccanismo di String.Format().

L'espressione può comprendere qualsiasi cosa sia nello scope. L'allineamento è la lunghezza del «campo» in cui si trova il testo. Se l'allineamento è positivo, il testo viene riempito con spazi a sinistra; se è negativo, il riempimento va a destra del testo.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf} bitcoins on {thatDay}, the day I forgot my password."
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Elementi di formato

Il testo tra parentesi graffe, segnaposto nel caso del formato composito ed espressioni interpolate nel caso dell'interpolazione di stringhe, è noto come elemento di formato.

Un elemento di formato può comprendere fino a 3 parti. La prima è l'espressione obbligatoria o il segnaposto dell'argomento, come si vede nel codice di esempio qui sopra. Inoltre, c'è un allineamento opzionale (introdotto da una virgola, «,») e una stringa di formato opzionale (introdotta da due punti, «:»).

{<interpolationExpression>[,<alignment>][:<formatString>]}

L'allineamento specifica la lunghezza del «campo» in cui il testo viene inserito, riempito con spazi a sinistra se l'allineamento è positivo o a destra se è negativo.

La stringa di formato specifica la forma dell'output testuale, ad esempio se includere i separatori delle migliaia per un numero o se restituire solo la parte relativa alla data di un oggetto DateTime.

Il codice seguente mostra la visualizzazione della parte relativa alla data di un oggetto DateTime e di un numero in virgola mobile in forma esponenziale.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf:E} bitcoins on {thatDay:d}, the day I forgot my password."
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

string.Format(
    "I had {0:E} bitcoins on {1:d}, the day I forgot my password.",
    loadsOf, thatDay)
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

Esiste sia la formattazione standard sia quella personalizzata, per numeri e date. Non c'è una differenza sostanziale tra personalizzata e standard, se non che hai la possibilità di comporre stringhe di formato personalizzate a partire dai caratteri di formato. «custom» in questo contesto non ha nulla a che vedere con l'interfaccia ICustomFormatter, che si usa quando sviluppi i tuoi formattatori personalizzati.

Formattatori e stringhe di formato della BCL

La Base Class Library (BCL) fornisce 2 formattatori, DateTimeFormatInfo e NumberFormatInfo, e 6 gruppi di stringhe di formato.

I vari elenchi di stringhe di formato sono qui sotto:

Le stringhe di formato per Enum e GUID possono essere classificate come standard. Sebbene enum e GUID abbiano overload di ToString() che accettano un IFormatProvider, non è chiaro che facciano qualcosa.

Nella libreria si cerca di dare una certa coerenza alle stringhe di formato (al di là del fatto che sono rappresentate come stringhe). Questo sforzo di coerenza si ritrova nelle stringhe standard. In realtà, come sviluppatore raramente ti importa della differenza tra stringhe standard e personalizzate. Anche se, se stai implementando dei formattatori per le tue classi, è una buona idea rispecchiare le stringhe standard esistenti quando le tue classi sembrano richiederlo, puoi comunque ignorare quasi del tutto la differenza.

Cultura

Ogni thread di esecuzione ha una cultura predefinita, Thread.CurrentThread.CurrentCulture, incapsulata in un'istanza di CultureInfo. La cultura del thread determina come vengono formattati per impostazione predefinita date e numeri, tenendo conto delle variazioni regionali, come la differenza nel formato di data convenzionale tra il Regno Unito DD/MM/YYYY e gli Stati Uniti MM/DD/YYYY.

CultureInfo implementa l'interfaccia IFormatProvider, che può essere passata a certi overload di String.Format(). Questo permette di sovrascrivere la cultura del thread.

Materiale di riferimento

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Formattazione di stringhe

La pratica è bloccata

Sblocca 11 altri esercizi per esercitarti su Formattazione di stringhe