Konstruowanie ciągów sformatowanych ciągów za pomocą interpolacji ciągów
W tym samouczku pokazano, jak za pomocą interpolacji ciągów języka C# wstawić wartości do pojedynczego ciągu wynikowego. Napiszesz kod w języku C# i zobaczysz wyniki kompilowania i uruchamiania go. Samouczek zawiera serię lekcji, które pokazują, jak wstawiać wartości do ciągu i formatować te wartości na różne sposoby.
Ten samouczek oczekuje, że masz maszynę, której możesz użyć do programowania. Samouczek platformy .NET Hello world w ciągu 10 minut zawiera instrukcje dotyczące konfigurowania lokalnego środowiska projektowego w systemie Windows, Linux lub macOS. Możesz również ukończyć interaktywną wersję tego samouczka w przeglądarce.
Tworzenie ciągu interpolowanego
Utwórz katalog o nazwie interpolowany. Ustaw go jako bieżący katalog i uruchom następujące polecenie w oknie konsoli:
dotnet new console
To polecenie tworzy nową aplikację konsolową platformy .NET Core w bieżącym katalogu.
Otwórz plik Program.cs w ulubionym edytorze i zastąp wiersz Console.WriteLine("Hello World!");
następującym kodem, w którym zastąp <name>
ciąg nazwą:
var name = "<name>";
Console.WriteLine($"Hello, {name}. It's a pleasure to meet you!");
Wypróbuj ten kod, wpisując dotnet run
polecenie w oknie konsoli. Kiedy uruchomisz program, zostanie wyświetlony jeden ciąg z Twoim imieniem w powitaniu. Ciąg zawarty w wywołaniu WriteLine metody jest wyrażeniem ciągu interpolowanego. Jest to rodzaj szablonu, który umożliwia skonstruowanie pojedynczego ciągu (zwanego ciągiem wynikowym) z ciągu obejmującego osadzony kod. Ciągi interpolowane są szczególnie użyteczne do wstawiania wartości do ciągu lub łączenia ciągów.
Ten prosty przykład zawiera dwa elementy, które musi mieć każdy ciąg interpolowany:
Literał ciągu rozpoczynający się od znaku
$
przed otwierającym znakiem cudzysłowu. Pomiędzy symbolem$
i znakiem zapytania nie może być żadnych odstępów. (Jeśli chcesz zobaczyć, co się stanie, jeśli go dołączysz, wstaw spację po$
znaku, zapisz plik i uruchom program ponownie, wpisując poleceniedotnet run
w oknie konsoli. Kompilator języka C# wyświetla komunikat o błędzie "error CS1056: Unexpected character '$'".Co najmniej jedno wyrażenie interpolacji. Wyrażenie interpolacji jest wskazywane przez otwierający i zamykający nawias klamrowy (
{
i}
). Do nawiasów klamrowych możesz wstawić dowolne wyrażenie języka C# zwracające wartość (w tymnull
).
Wypróbujmy jeszcze kilka przykładów interpolacji ciągów z innymi typami danych.
Uwzględnianie innych typów danych
W poprzedniej sekcji użyto interpolacji ciągów, aby wstawić jeden ciąg wewnątrz innego. Wynik wyrażenia interpolacji może mieć dowolny typ danych. Uwzględnijmy wartości różnych typów danych w ciągu interpolowanym.
W poniższym przykładzie najpierw definiujemy typ Vegetable
danych klasy, który ma Name
właściwość i metodęToString
, która zastępuje zachowanie Object.ToString() metody. Modyfikatorpublic
dostępu udostępnia tę metodę dowolnemu kodowi klienta, aby uzyskać reprezentację Vegetable
ciągu wystąpienia. W przykładzie Vegetable.ToString
metoda zwraca wartość Name
właściwości zainicjowanej w konstruktorzeVegetable
:
public Vegetable(string name) => Name = name;
Następnie tworzymy wystąpienie Vegetable
klasy o nazwie item
przy użyciu new
operatora i podajemy nazwę konstruktora Vegetable
:
var item = new Vegetable("eggplant");
Na koniec dołączymy zmienną item
do ciągu interpolowanego, który zawiera DateTime również wartość, Decimal wartość i Unit
wartość wyliczenia. Zastąp cały kod języka C# w edytorze następującym kodem, a następnie użyj dotnet run
polecenia , aby go uruchomić:
using System;
public class Vegetable
{
public Vegetable(string name) => Name = name;
public string Name { get; }
public override string ToString() => Name;
}
public class Program
{
public enum Unit { item, kilogram, gram, dozen };
public static void Main()
{
var item = new Vegetable("eggplant");
var date = DateTime.Now;
var price = 1.99m;
var unit = Unit.item;
Console.WriteLine($"On {date}, the price of {item} was {price} per {unit}.");
}
}
Należy pamiętać, że wyrażenie item
interpolacji w ciągu interpolowanym jest rozpoznawane jako tekst "eggplant" w ciągu wynikowym. Dzieje się tak dlatego, że gdy typ wyniku wyrażenia nie jest ciągiem, wynik jest rozpoznawany jako ciąg w następujący sposób:
Jeśli wyrażenie interpolacji daje w wyniku wartość
null
, jest używany pusty ciąg ("" lub String.Empty).Jeśli wyrażenie interpolacji nie daje wartości
null
, zazwyczajToString
wywoływana jest metoda typu wyniku. Można to przetestować, aktualizując implementacjęVegetable.ToString
metody . Być może nawet nie trzeba implementowaćToString
metody, ponieważ każdy typ ma implementację tej metody. Aby to przetestować, oznacz jako komentarz definicjęVegetable.ToString
metody w przykładzie (w tym celu umieść przed nim symbol komentarza ,//
). W danych wyjściowych ciąg "eggplant" jest zastępowany przez w pełni kwalifikowaną nazwę typu ("Warzywo" w tym przykładzie), co jest zachowaniem domyślnym Object.ToString() metody. Domyślnym zachowaniemToString
metody dla wartości wyliczenia jest zwrócenie reprezentacji ciągu wartości.
W danych wyjściowych z tego przykładu data jest zbyt precyzyjna (cena bakłażana nie zmienia się co sekundę), a wartość ceny nie wskazuje jednostki waluty. W następnej sekcji dowiesz się, jak rozwiązać te problemy, kontrolując format reprezentacji ciągu w wynikach wyrażenia.
Kontrolowanie formatowania wyrażeń interpolacji
W poprzedniej sekcji do ciągu wynikowego wstawiono dwa źle sformatowane ciągi. Jednym z nich była wartość daty i godziny, chociaż tylko data powinna mieć zastosowanie. Drugi był ceną, która nie wskazywała swojej jednostki waluty. Oba problemy można z łatwością rozwiązać. Interpolacja ciągów umożliwia określenie ciągów formatu kontrolujących formatowanie określonych typów. Zmodyfikuj wywołanie metody Console.WriteLine
z poprzedniego przykładu, aby uwzględnić ciągi formatu dla wyrażeń daty i ceny, jak pokazano w następującym wierszu:
Console.WriteLine($"On {date:d}, the price of {item} was {price:C2} per {unit}.");
Należy określić ciąg formatu, postępując zgodnie z wyrażeniem interpolacji z dwukropkiem (":") i ciągiem formatu. „d” jest standardowym ciągiem formatu daty i godziny, który reprezentuje krótki format daty. "C2" to standardowy ciąg formatu liczbowego , który reprezentuje liczbę jako wartość waluty z dwiema cyframi po przecinku dziesiętnym.
Wiele typów w bibliotekach .NET obsługuje wstępnie zdefiniowany zestaw ciągów formatu. Uwzględnia to wszystkie typy numeryczne oraz typy daty i godziny. Aby uzyskać kompletną listę typów, które obsługują ciągi formatu, zobacz Ciągi formatu i typy biblioteki klas .NET w artykule Typy formatowania na platformie .NET.
Spróbuj zmodyfikować ciągi formatu w edytorze tekstów i za każdym razem, gdy wprowadzisz zmianę, uruchom ponownie program, aby zobaczyć, jak zmiany wpływają na formatowanie daty i godziny oraz wartości liczbowej. Zmień „d” w ciągu {date:d}
na „t” (aby wyświetlić krótki format daty), „y” (aby wyświetlić rok i miesiąc) oraz „yyyy” (aby wyświetlać rok jako liczbę czterocyfrową). Zmień „C2” w ciągu {price:C2}
na „e” (notacja wykładnicza) oraz „F3” (wartość numeryczna z trzema cyframi po separatorze dziesiętnym).
Oprócz kontrolowania formatowania można również kontrolować szerokość pola i wyrównanie sformatowanych ciągów zawartych w ciągu wynikowym. W następnej sekcji dowiesz się, jak to zrobić.
Kontrolowanie szerokości pola i wyrównania wyrażeń interpolacji
Zwykle, gdy wynik wyrażenia interpolacji jest sformatowany na ciąg, ciąg jest uwzględniany w ciągu wynikowym bez spacji wiodących lub końcowych. Szczególnie w przypadku pracy z zestawem danych możliwość kontrolowania szerokości pola i wyrównania tekstu pomaga wygenerować bardziej czytelne dane wyjściowe. Aby to zobaczyć, zastąp cały kod w edytorze tekstów następującym kodem, a następnie wpisz dotnet run
polecenie , aby wykonać program:
using System;
using System.Collections.Generic;
public class Example
{
public static void Main()
{
var titles = new Dictionary<string, string>()
{
["Doyle, Arthur Conan"] = "Hound of the Baskervilles, The",
["London, Jack"] = "Call of the Wild, The",
["Shakespeare, William"] = "Tempest, The"
};
Console.WriteLine("Author and Title List");
Console.WriteLine();
Console.WriteLine($"|{"Author",-25}|{"Title",30}|");
foreach (var title in titles)
Console.WriteLine($"|{title.Key,-25}|{title.Value,30}|");
}
}
Nazwy autorów są wyrównane do lewej, a napisane przez nich tytuły są wyrównane do prawej. Wyrównanie określa się przez dodanie przecinka (",") po wyrażeniu interpolacji i wyznaczeniu minimalnej szerokości pola. Jeśli określona wartość jest liczbą dodatnią, pole jest wyrównane do prawej. Jeśli jest to liczba ujemna, pole jest wyrównane do lewej.
Spróbuj usunąć znaki ujemne z kodu {"Author",-25}
i i {title.Key,-25}
i ponownie uruchomić przykład, jak robi następujący kod:
Console.WriteLine($"|{"Author",25}|{"Title",30}|");
foreach (var title in titles)
Console.WriteLine($"|{title.Key,25}|{title.Value,30}|");
Tym razem informacje o autorze są wyrównane do prawej.
Można połączyć specyfikator wyrównania i ciąg formatu dla pojedynczego wyrażenia interpolacji. Aby to zrobić, najpierw określ wyrównanie, a następnie dwukropek i ciąg formatu. Zastąp cały kod wewnątrz Main
metody następującym kodem, który wyświetla trzy sformatowane ciągi ze zdefiniowanymi szerokościami pól. Następnie uruchom program, wprowadzając dotnet run
polecenie .
Console.WriteLine($"[{DateTime.Now,-20:d}] Hour [{DateTime.Now,-10:HH}] [{1063.342,15:N2}] feet");
Dane wyjściowe wyglądają mniej więcej tak:
[04/14/2018 ] Hour [16 ] [ 1,063.34] feet
Ukończono samouczek interpolacji ciągów.
Aby uzyskać więcej informacji, zobacz temat Interpolacja ciągów i samouczek Interpolacja ciągów w języku C# .