In C#/.NET esistono due meccanismi principali per formattare le stringhe: l'uso di String.Format() e l'interpolazione di stringhe.
String.Format() accetta una stringa (chiamata formato composito nella documentazione) composta da testo fisso e segnaposto (chiamati elementi di formato nella documentazione), 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
Questo meccanismo è tecnicamente noto come formattazione composita.
Le stringhe interpolate sono precedute da un $ e contengono espressioni valutate a runtime racchiuse tra parentesi graffe. L'elemento di formato ha la seguente sintassi: $"{<interpolationExpression>}". Eliminano la necessità di una lista separata di argomenti. Il risultato è funzionalmente equivalente a quello del meccanismo String.Format().
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
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, ci sono un allineamento opzionale (introdotto da una virgola, ",") e una stringa di formato opzionale (introdotta dai due punti, ":").
{<interpolationExpression>[,<alignment>][:<formatString>]}
L'allineamento specifica la lunghezza del «campo» in cui viene inserito il testo, 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 seguente codice illustra 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
Esistono formattazioni sia standard che personalizzate, sia per i numeri che per le date. Non c'è alcuna differenza sostanziale tra quelle personalizzate e quelle standard, se non che hai la possibilità di comporre stringhe di formato personalizzate a partire dalle lettere di formato.
Ogni thread ha una cultura predefinita, Thread.CurrentThread.CurrentCulture, incapsulata in un'istanza di CultureInfo. La cultura del thread determina come vengono formattate date e numeri rispetto alle varianti regionali, come la differenza nel formato di data convenzionale tra il formato britannico DD/MM/YYYY e quello statunitense MM/DD/YYYY.
CultureInfo implementa l'interfaccia IFormatProvider, che può essere passata a determinati overload di String.Format(). Questo può servire a sovrascrivere la cultura del thread.
Le stringhe verbatim consentono stringhe su più righe. Sono introdotte da una @.
string str = @"
See no wretched
quotes everywhere
";
In questo esercizio aiuterai due fidanzatini del liceo a dichiarare il loro amore sui social media.
Implementa il metodo statico HighSchoolSweethearts.DisplaySingleLine() in modo che prenda due nomi e li mostri separati da un cuore.
Il testo formattato deve essere largo 61 caratteri, con il cuore al centro della stringa.
È garantito che tutti i nomi ci stiano comodamente nella larghezza della riga.
HighSchoolSweethearts.DisplaySingleLine("Lance Green", "Pat Riley");
// => " Lance Green ♡ Pat Riley "
Implementa il metodo statico HighSchoolSweethearts.DisplayBanner(), che mostra i due gruppi di iniziali separati da un segno più.
HighSchoolSweethearts.DisplayBanner("L. G.", "P. R.");
// see the ascii art below
****** ******
** ** ** **
** ** ** **
** * **
** **
** L. G. + P. R. **
** **
** **
** **
** **
** **
** **
***
*
Implementa il metodo statico HighSchoolSweethearts.DisplayGermanExchangeStudents() per mostrare la data di inizio della relazione e la durata per i nostri studenti di scambio tedeschi.
HighSchoolSweethearts.DisplayGermanExchangeStudents("Norbert", "Heidi", new DateTime(2019, 1, 22), 1535.22f);
// => "Norbert and Heidi have been dating since 22.01.2019 - that's 1.535,22 hours"
Iscriviti a Exercism per imparare e padroneggiare C# con 62 concetti178 esercizi e il mentoring di persone reali, tutto gratis.