Použití interpolace řetězců k vytvoření formátovaných řetězců
V tomto kurzu se naučíte, jak pomocí interpolace řetězců jazyka C# vložit hodnoty do jednoho výsledného řetězce. Napíšete kód jazyka C# a zobrazíte výsledky jeho kompilace a spuštění. Tento kurz obsahuje řadu lekcí, které vám ukážou, jak vložit hodnoty do řetězce a různými způsoby je formátovat.
Tento kurz očekává, že máte počítač, který můžete použít pro vývoj. Kurz k .NET Hello World za 10 minut obsahuje pokyny k nastavení místního vývojového prostředí ve Windows, Linuxu nebo macOS. Interaktivní verzi tohoto kurzu můžete také dokončit v prohlížeči.
Vytvoření interpolovaného řetězce
Vytvořte adresář s názvem interpolated. Nastavte ho jako aktuální adresář a v okně konzoly spusťte následující příkaz:
dotnet new console
Tento příkaz vytvoří novou konzolovou aplikaci .NET Core v aktuálním adresáři.
Otevřete program.cs ve svém oblíbeném editoru a nahraďte řádek Console.WriteLine("Hello World!");
následujícím kódem, kde nahradíte <name>
svým jménem:
var name = "<name>";
Console.WriteLine($"Hello, {name}. It's a pleasure to meet you!");
Vyzkoušejte tento kód zadáním dotnet run
v okně konzoly. Po spuštění programu se zobrazí jeden řetězec s pozdravem, který obsahuje vaše jméno. Řetězec zahrnutý ve WriteLine volání metody je interpolovaný řetězcový výraz. Jedná se o druh šablony, který umožňuje vytvořit jeden řetězec (označovaný jako výsledný řetězec) z řetězce obsahujícího vložený kód. Interpolované řetězce se hodí hlavně k vkládání hodnot do řetězce nebo k řetězení (spojování) řetězců.
Tento jednoduchý příklad obsahuje oba prvky, které jsou v každém interpolovaném řetězci povinné:
Řetězcový literál, který začíná znakem
$
před počátečním znakem uvozovek. Mezi symbolem$
a znakem uvozovek nesmí být žádné mezery. (Pokud chcete zjistit, co se stane, když nějaký zadáte, vložte za znak mezeru$
, uložte soubor a spusťte program znovu zadánímdotnet run
v okně konzoly. Kompilátor jazyka C# zobrazí chybovou zprávu Chyba CS1056: Neočekávaný znak $.)Jeden nebo více výrazů interpolace. Interpolační výraz je označen levou a pravou složenou závorkou (
{
a}
). Do složených závorek můžete vložit libovolný výraz v C#, který vrací hodnotu (včetně hodnotynull
).
Pojďme vyzkoušet několik dalších příkladů interpolace řetězců s některými dalšími datovými typy.
Zahrnutí různých datových typů
V předchozí části jste použili interpolaci řetězců k vložení jednoho řetězce do druhého. Výsledek interpolačního výrazu ale může být libovolného datového typu. Pojďme do interpolovaného řetězce zahrnout hodnoty různých datových typů.
V následujícím příkladu nejprve definujeme datový typ Vegetable
třídy, který má Name
vlastnost a metoduToString
, která přepíše chování Object.ToString() metody. Modifikátorpublic
přístupu zpřístupňuje tuto metodu všem klientským kódům pro získání řetězcové Vegetable
reprezentace instance. V příkladu Vegetable.ToString
metoda vrátí hodnotu Name
vlastnosti, která je inicializována v konstruktoruVegetable
:
public Vegetable(string name) => Name = name;
Potom vytvoříme instanci Vegetable
třídy s názvem item
pomocí operátorunew
a zadáním názvu konstruktoru Vegetable
:
var item = new Vegetable("eggplant");
Nakonec zahrneme proměnnou item
do interpolovaného řetězce, který obsahuje DateTime také hodnotu, Decimal hodnotu a hodnotu výčtuUnit
. Nahraďte veškerý kód jazyka C# v editoru následujícím kódem a pak ho dotnet run
spusťte pomocí příkazu :
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}.");
}
}
Všimněte si, že interpolační výraz item
v interpolovaném řetězci se ve výsledném řetězci přeloží na text "lilek". Je to proto, že pokud typ výsledku výrazu není řetězec, výsledek se přeloží na řetězec následujícím způsobem:
Pokud se interpolační výraz vyhodnotí jako , použije se
null
prázdný řetězec ("" nebo String.Empty).Pokud se interpolační výraz nevyhodnotí jako
null
, obvykleToString
se volá metoda typu výsledku. Můžete to otestovat aktualizací implementaceVegetable.ToString
metody . Možná ani nebudete muset implementovat metoduToString
, protože každý typ má nějakou implementaci této metody. Pokud to chcete otestovat, zakomentujte definiciVegetable.ToString
metody v příkladu (uděláte to tak, že před něj vložíte symbol//
komentáře ). Ve výstupu je řetězec "lilek" nahrazen plně kvalifikovaným názvem typu ("Vegetable" v tomto příkladu), což je výchozí chování Object.ToString() metody. Výchozí chováníToString
metody pro hodnotu výčtu je vrácení řetězcové reprezentace hodnoty.
Ve výstupu z tohoto příkladu je datum příliš přesné (cena lilku se nemění každou sekundu) a hodnota ceny neznamená jednotku měny. V další části se dozvíte, jak tyto problémy vyřešit pomocí řízení formátu řetězcových reprezentací výsledků výrazu.
Řízení formátování interpolačních výrazů
V předchozí části byly do výsledného řetězce vloženy dva špatně formátované řetězce. Jedním byla hodnota data a času, ze které potřebujeme zachovat jenom datum. Druhá byla cena, která neudávala svou jednotku měny. Oba problémy můžeme snadno vyřešit. Interpolace řetězců umožňuje určit formátovací řetězce , které řídí formátování konkrétních typů. Upravte volání Console.WriteLine
metody z předchozího příkladu tak, aby zahrnovalo řetězce formátu pro výrazy data a ceny, jak je znázorněno na následujícím řádku:
Console.WriteLine($"On {date:d}, the price of {item} was {price:C2} per {unit}.");
Formátovací řetězec zadáte pomocí interpolačního výrazu dvojtečka (":") a formátovací řetězec. „d“ je standardní formátovací řetězec data a času, který představuje krátký formát data. "C2" je standardní číselný formátovací řetězec , který představuje číslo jako hodnotu měny se dvěma číslicemi za desetinnou čárkou.
Řada typů v knihovnách .NET podporuje předdefinovanou sadu formátových řetězců. Mezi ně patří i všechny číselné typy a typy data a času. Úplný seznam typů podporujících formátovací řetězce najdete v části Formátovací řetězce a typy v knihovně tříd .NET v článku Formátovací typy v rozhraní .NET.
Zkuste upravit formátovací řetězce v textovém editoru a pokaždé, když uděláte nějakou změnu, spusťte program znovu, abyste viděli, jak změny ovlivňují formátování data a času a číselné hodnoty. Ve výrazu {date:d}
změňte „d“ na „t“ (zobrazí se krátký formát času), „y“ (zobrazí se rok a měsíc) a „yyyy“ (zobrazí se rok v podobě čtyřmístného čísla). Ve výrazu {price:C2}
změňte „C2“ na „e“ (zobrazí se exponenciální tvar čísla) a „F3“ (zobrazí se číselná hodnota se třemi číslicemi za desetinnou čárkou).
Kromě řízení formátování můžete také řídit šířku pole a zarovnání formátovaných řetězců, které jsou součástí výsledného řetězce. V další části se dozvíte, jak to udělat.
Řízení šířky pole a zarovnání interpolačních výrazů
Obvykle platí, že pokud je výsledek interpolačního výrazu naformátován na řetězec, je tento řetězec součástí výsledného řetězce bez úvodních a koncových mezer. Zejména když pracujete se sadou dat, možnost řídit šířku pole a zarovnání textu pomáhá vytvořit čitelnější výstup. Pokud to chcete vidět, nahraďte veškerý kód v textovém editoru následujícím kódem a zadáním příkazu dotnet run
program spusťte:
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}|");
}
}
Jména autorů jsou zarovnaná doleva a názvy, které napsali, jsou zarovnané doprava. Zarovnání určíte tak, že za interpolační výraz přidáte čárku (",") a určíte minimální šířku pole. Pokud je zadaná hodnota kladné číslo, je pole zarovnané doprava. Pokud se jedná o záporné číslo, je pole zarovnané doleva.
Zkuste z {"Author",-25}
kódu a {title.Key,-25}
odebrat záporná znaménka a spusťte příklad znovu, jak to dělá následující kód:
Console.WriteLine($"|{"Author",25}|{"Title",30}|");
foreach (var title in titles)
Console.WriteLine($"|{title.Key,25}|{title.Value,30}|");
Tentokrát jsou informace o autorovi zarovnané doprava.
Můžete zkombinovat specifikátor zarovnání a formátovací řetězec pro jeden interpolační výraz. Uděláte to tak, že nejprve zadáte zarovnání, za kterým následuje dvojtečka a formátovací řetězec. Nahraďte veškerý kód uvnitř Main
metody následujícím kódem, který zobrazí tři formátované řetězce s definovanými šířkami polí. Potom spusťte program zadáním dotnet run
příkazu .
Console.WriteLine($"[{DateTime.Now,-20:d}] Hour [{DateTime.Now,-10:HH}] [{1063.342,15:N2}] feet");
Výstup vypadá přibližně takto:
[04/14/2018 ] Hour [16 ] [ 1,063.34] feet
Dokončili jste kurz interpolace řetězců.
Další informace najdete v tématu Interpolace řetězců a v kurzu Interpolace řetězců v jazyce C# .