Διαδρομές
/
C#
C#
/
Ύλη
/
Μορφοποίηση συμβολοσειρών
Μο

Μορφοποίηση συμβολοσειρών σε C#

13 ασκήσεις

Σχετικά με την έννοια Μορφοποίηση συμβολοσειρών

Οι μηχανισμοί για τη μορφοποίηση συμβολοσειρών είναι πολλοί και ποικίλοι στη C#/.NET: από την απλή συνένωση αντικειμένων και τις κλήσεις στην παρακαμμένη μέθοδο object.ToString() μέχρι τη χρήση του ICustomFormatter (δεν καλύπτεται σε αυτή την άσκηση).

Οι δύο πιο συνηθισμένοι μηχανισμοί για τη μορφοποίηση συμβολοσειρών είναι η παρεμβολή συμβολοσειρών και η String.Format(). Η κλάση StringBuilder (παραπομπή προς συμπλήρωση) μπορεί επίσης να χρησιμοποιηθεί για να χτιστεί μια συμβολοσειρά όταν υπάρχει πολυπλοκότητα, όπως πολλαπλές γραμμές.

Χρήση της ToString()

Η System.Object(), από την οποία κληρονομούν όλες οι κλάσεις και οι δομές, έχει μια μέθοδο ToString(). Για παράδειγμα, η new DateTime(2019, 5, 23).ToString() θα αποδώσει "05/23/2019 00:00:00" (σε ένα νήμα με κουλτούρα ΗΠΑ, δείτε παρακάτω). Υπάρχουν περιπτώσεις, όπως η συνένωση συμβολοσειρών, όπου αυτή η προεπιλεγμένη μέθοδος ToString() μπορεί να κληθεί έμμεσα: η "" + new DateTime(2019, 5, 23) δίνει το ίδιο αποτέλεσμα.

Εκτός από την προεπιλεγμένη μέθοδο ToString(), οι τύποι όπου η μορφοποίηση είναι ζήτημα έχουν υπερφορτώσεις που δέχονται μια συμβολοσειρά μορφοποίησης ή ακόμα και έναν πάροχο μορφοποίησης. Στη BCL (Base Class Library) αυτοί είναι συγκεκριμένα οι αριθμοί, οι ημερομηνίες, οι απαριθμήσεις και τα GUID.

Σύνθετη μορφοποίηση

Η 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

Η Format() μπορεί να είναι καλύτερη επιλογή από την παρεμβολή όταν η μορφή χρησιμοποιείται σε πολλαπλές εκφράσεις ως ένα είδος προτύπου, ή όταν η ενσωμάτωση της μορφής και των εκφράσεων που θα μορφοποιηθούν είναι πολύ δυσκίνητη, όπως όταν εμπλέκονται [συμβολοσειρές verbatim][verbatim-strings].

Ο μηχανισμός αυτός είναι τεχνικά γνωστός ως σύνθετη μορφοποίηση.

Ένας πληρέστερος κατάλογος μεθόδων που παράγουν συμβολοσειρές και αξιοποιούν τη σύνθετη μορφοποίηση δίνεται σε αυτό το άρθρο.

Παρεμβολή συμβολοσειρών

Οι συμβολοσειρές με παρεμβολή έχουν πρόθεμα $ και περιλαμβάνουν εκφράσεις χρόνου εκτέλεσης μέσα σε άγκιστρα. Το στοιχείο μορφοποίησης έχει την εξής σύνταξη: $"{<interpolationExpression>[,<alignment>][:<formatString>]}". Καταργούν την ανάγκη για ξεχωριστή λίστα ορισμάτων. Το αποτέλεσμα είναι λειτουργικά ισοδύναμο με τον μηχανισμό 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

Υπάρχει τόσο τυπική όσο και προσαρμοσμένη μορφοποίηση, και για αριθμούς και για ημερομηνίες. Δεν υπάρχει ουσιαστική διαφορά μεταξύ προσαρμοσμένης και τυπικής μορφοποίησης, εκτός από το ότι έχεις την ευκαιρία να συνθέσεις προσαρμοσμένες συμβολοσειρές μορφοποίησης από χαρακτήρες μορφοποίησης. Το "custom" σε αυτό το πλαίσιο δεν έχει καμία σχέση με τη διεπαφή ICustomFormatter, η οποία χρησιμοποιείται όταν αναπτύσσεις τους δικούς σου προσαρμοσμένους μορφοποιητές.

Μορφοποιητές και συμβολοσειρές μορφοποίησης της BCL

Η BCL (Base Class Library) παρέχει 2 μορφοποιητές, τους DateTimeFormatInfo και NumberFormatInfo, και 6 ομάδες συμβολοσειρών μορφοποίησης.

Οι διάφορες λίστες συμβολοσειρών μορφοποίησης είναι παρακάτω:

Οι συμβολοσειρές μορφοποίησης για Enum και GUID μπορούν να καταταχθούν στις τυπικές. Αν και τα enum και GUID έχουν υπερφορτώσεις της ToString() που δέχονται ένα IFormatProvider, δεν είναι ξεκάθαρο ότι αυτό κάνει κάτι.

Στη βιβλιοθήκη γίνεται μια προσπάθεια να καλλιεργηθεί κάποια συνέπεια στις συμβολοσειρές μορφοποίησης (πέρα από το γεγονός ότι αναπαρίστανται ως συμβολοσειρές). Αυτή η προσπάθεια για συνέπεια εντοπίζεται στις τυπικές συμβολοσειρές. Στην πράξη, ως προγραμματιστής σπάνια σε νοιάζει η διαφορά μεταξύ τυπικών και προσαρμοσμένων συμβολοσειρών. Αν και είναι καλή ιδέα, όταν υλοποιείς μορφοποιητές για δικές σου κλάσεις, να απηχείς τις υπάρχουσες τυπικές συμβολοσειρές εφόσον οι κλάσεις σου φαίνεται να το απαιτούν, μπορείς κάλλιστα να αγνοήσεις τη διαφορά.

Κουλτούρα

Κάθε νήμα εκτέλεσης έχει μια προεπιλεγμένη κουλτούρα, τη Thread.CurrentThread.CurrentCulture, η οποία είναι ενσωματωμένη σε ένα στιγμιότυπο της CultureInfo. Η κουλτούρα του νήματος καθορίζει πώς μορφοποιούνται οι ημερομηνίες και οι αριθμοί από προεπιλογή, ως προς τοπικές παραλλαγές όπως η διαφορά στη συμβατική μορφή ημερομηνίας μεταξύ του Ηνωμένου Βασιλείου (DD/MM/YYYY) και των ΗΠΑ (MM/DD/YYYY).

Η CultureInfo υλοποιεί τη διεπαφή IFormatProvider, η οποία μπορεί να περαστεί σε ορισμένες υπερφορτώσεις της String.Format(). Αυτό μπορεί να χρησιμοποιηθεί για να παρακάμψει την κουλτούρα του νήματος.

Υλικό αναφοράς

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Μορφοποίηση συμβολοσειρών

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 11 ακόμη ασκήσεις για να εξασκηθείς στην έννοια Μορφοποίηση συμβολοσειρών