Υπάρχουν δύο βασικοί μηχανισμοί για τη μορφοποίηση συμβολοσειρών σε C#/.NET: η χρήση της String.Format() και η παρεμβολή συμβολοσειρών.
Η String.Format() δέχεται μια συμβολοσειρά (που στην τεκμηρίωση αναφέρεται ως σύνθετη μορφοποίηση) η οποία αποτελείται από σταθερό κείμενο και σύμβολα θέσης (γνωστά στην τεκμηρίωση ως στοιχεία μορφοποίησης), καθώς και έναν μεταβλητό αριθμό ορισμάτων. Η τιμή επιστροφής επιλύει κάθε στοιχείο μορφοποίησης χρησιμοποιώντας το αντίστοιχο όρισμα και συνδυάζει τις επιλυμένες τιμές με το σταθερό κείμενο.
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
Αυτός ο μηχανισμός είναι τεχνικά γνωστός ως σύνθετη μορφοποίηση.
Οι παρεμβαλλόμενες συμβολοσειρές έχουν πρόθεμα το $ και περιλαμβάνουν εκφράσεις χρόνου εκτέλεσης μέσα σε άγκιστρα. Το στοιχείο μορφοποίησης έχει την εξής σύνταξη: $"{<interpolationExpression>}". Καταργούν την ανάγκη για μια ξεχωριστή λίστα ορισμάτων. Το αποτέλεσμα είναι λειτουργικά ισοδύναμο με τον μηχανισμό της 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
Το κείμενο μέσα στα άγκιστρα, δηλαδή τα σύμβολα θέσης στην περίπτωση της σύνθετης μορφοποίησης και οι παρεμβαλλόμενες εκφράσεις στην περίπτωση της παρεμβολής συμβολοσειρών, είναι γνωστό ως στοιχείο μορφοποίησης.
Ένα στοιχείο μορφοποίησης μπορεί να αποτελείται από έως 3 μέρη. Το πρώτο είναι η υποχρεωτική έκφραση ή το σύμβολο θέσης του ορίσματος, όπως φαίνεται στο παραπάνω παράδειγμα κώδικα. Επιπλέον, υπάρχει μια προαιρετική στοίχιση (που εισάγεται με κόμμα, ",") και μια προαιρετική συμβολοσειρά μορφοποίησης (που εισάγεται με άνω και κάτω τελεία, ":").
{<interpolationExpression>[,<alignment>][:<formatString>]}
Η στοίχιση καθορίζει το μήκος του "πεδίου" στο οποίο τοποθετείται το κείμενο, με συμπλήρωση κενών στα αριστερά αν η στοίχιση είναι θετική ή στα δεξιά αν είναι αρνητική.
Η συμβολοσειρά μορφοποίησης καθορίζει τη μορφή του κειμένου εξόδου, όπως αν θα περιλαμβάνονται διαχωριστικά χιλιάδων για έναν αριθμό ή αν θα εξάγεται μόνο το τμήμα της ημερομηνίας ενός αντικειμένου DateTime.
Ο παρακάτω κώδικας δείχνει την εμφάνιση του τμήματος ημερομηνίας ενός αντικειμένου DateTime και ενός αριθμού κινητής υποδιαστολής σε εκθετική μορφή.
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
Υπάρχει τόσο τυπική όσο και προσαρμοσμένη μορφοποίηση, και για αριθμούς και για ημερομηνίες. Δεν υπάρχει ουσιαστική διαφορά μεταξύ προσαρμοσμένης και τυπικής μορφοποίησης, παρά μόνο ότι έχεις την ευκαιρία να συνθέσεις προσαρμοσμένες συμβολοσειρές μορφοποίησης από γράμματα μορφοποίησης.
Κάθε νήμα έχει μια προεπιλεγμένη κουλτούρα, τη Thread.CurrentThread.CurrentCulture, η οποία είναι ενθυλακωμένη σε ένα στιγμιότυπο της CultureInfo. Η κουλτούρα του νήματος καθορίζει πώς μορφοποιούνται οι ημερομηνίες και οι αριθμοί ως προς τις τοπικές παραλλαγές, όπως η διαφορά στη συμβατική μορφή ημερομηνίας μεταξύ ΗΒ DD/MM/YYYY και ΗΠΑ MM/DD/YYYY.
Η CultureInfo υλοποιεί τη διεπαφή IFormatProvider, η οποία μπορεί να περαστεί σε ορισμένες υπερφορτώσεις της String.Format(). Αυτό μπορεί να χρησιμοποιηθεί για να παρακάμψεις την κουλτούρα του νήματος.
Οι καταλεπιστί συμβολοσειρές επιτρέπουν συμβολοσειρές πολλών γραμμών. Εισάγονται με ένα @.
string str = @"
See no wretched
quotes everywhere
";
Σε αυτή την άσκηση, θα βοηθήσεις ερωτευμένους του λυκείου να δηλώσουν τον έρωτά τους στα μέσα κοινωνικής δικτύωσης.
Υλοποίησε τη στατική μέθοδο HighSchoolSweethearts.DisplaySingleLine() ώστε να παίρνει δύο ονόματα και να τα εμφανίζει χωρισμένα με μια καρδιά.
Το μορφοποιημένο κείμενο πρέπει να έχει πλάτος 61 χαρακτήρες, με την καρδιά στο κέντρο της συμβολοσειράς.
Όλα τα ονόματα είναι σίγουρο ότι χωράνε άνετα στο πλάτος της γραμμής.
HighSchoolSweethearts.DisplaySingleLine("Lance Green", "Pat Riley");
// => " Lance Green ♡ Pat Riley "
Υλοποίησε τη στατική μέθοδο HighSchoolSweethearts.DisplayBanner() που εμφανίζει τα δύο ζεύγη αρχικών χωρισμένα με ένα σύμβολο συν.
HighSchoolSweethearts.DisplayBanner("L. G.", "P. R.");
// see the ascii art below
****** ******
** ** ** **
** ** ** **
** * **
** **
** L. G. + P. R. **
** **
** **
** **
** **
** **
** **
***
*
Υλοποίησε τη στατική μέθοδο HighSchoolSweethearts.DisplayGermanExchangeStudents() που δείχνει την ημερομηνία έναρξης της σχέσης και τη διάρκεια για τους Γερμανούς μαθητές ανταλλαγής μας.
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"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις C# με 62 έννοιες178 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.