Sdílet prostřednictvím


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ím dotnet 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ě hodnoty null).

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 Vegetabletřídy, který má Namevlastnost 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 nullprázdný řetězec ("" nebo String.Empty).

  • Pokud se interpolační výraz nevyhodnotí jako null, obvykle ToString se volá metoda typu výsledku. Můžete to otestovat aktualizací implementace Vegetable.ToString metody . Možná ani nebudete muset implementovat metodu ToString , protože každý typ má nějakou implementaci této metody. Pokud to chcete otestovat, zakomentujte definici Vegetable.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# .