Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Funkce složeného formátování .NET přebírá jako vstup seznam objektů a řetězec složeného formátu. Složený formátovací řetězec se skládá z pevného textu prokládaného indexovanými zástupnými symboly, označovanými jako formátovací položky. Tyto položky formátu odpovídají objektům v seznamu. Výsledkem operace formátování je výsledný řetězec, který se skládá z původního pevného textu smíšeného s řetězcovou reprezentací objektů v seznamu.
Důležité
Místo použití složených formátových řetězců můžete použít interpolované řetězce , pokud je jazyk a jeho verze, které používáte, podporované. Interpolovaný řetězec obsahuje interpolované výrazy. Každý interpolovaný výraz se vyhodnotí jako jeho hodnota a je zahrnut do výsledného řetězce, když je řetězec přiřazen. Další informace najdete v tématu Interpolace řetězců (referenční dokumentace jazyka C#) a interpolovaných řetězců (Referenční dokumentace jazyka Visual Basic).
Funkci složeného formátování podporují následující metody:
- String.Format, který vrátí formátovaný výsledný řetězec.
- StringBuilder.AppendFormat, který připojí formátovaný výsledný řetězec k objektu StringBuilder .
- Některá přetížení metody Console.WriteLine, která zobrazí formátovaný výsledný řetězec na konzoli.
- Některá přetížení TextWriter.WriteLine metody, které zapisují formátovaný výsledný řetězec do datového proudu nebo souboru. Třídy odvozené z TextWriter, například StreamWriter a HtmlTextWriter, také sdílet tuto funkci.
- Debug.WriteLine(String, Object[]), který vypíše formátovanou zprávu do naslouchačům trasování.
- Metody Trace.TraceError(String, Object[]), Trace.TraceInformation(String, Object[]) a Trace.TraceWarning(String, Object[]), které zobrazují formátované zprávy pro sledovací naslouchací procesy.
- Metoda TraceSource.TraceInformation(String, Object[]) , která zapisuje informační metodu pro trasování naslouchacích procesů.
Složený formátovací řetězec
Složený formátovací řetězec a seznam objektů se používají jako argumenty metod, které podporují funkci složeného formátování. Složený řetězec formátu se skládá z nuly nebo více úseků pevného textu proložených s jednou nebo více položkami formátu. Pevný text je libovolný řetězec, který zvolíte, a každá položka formátu odpovídá objektu nebo krabicové struktuře v seznamu. Řetězcová reprezentace každého objektu nahrazuje odpovídající položku formátu.
Zvažte následující Format fragment kódu:
string.Format("Name = {0}, hours = {1:hh}", "Fred", DateTime.Now);
String.Format("Name = {0}, hours = {1:hh}", "Fred", DateTime.Now)
Pevný text je Name =
a , hours =
. Položky formátu jsou {0}
, jejichž index 0 odpovídá objektu name
, a {1:hh}
, jehož index 1 odpovídá objektu DateTime.Now
.
Syntaxe formátování položek
Jednotlivé položky formátu mají následující podobu a skládají se z následujících součástí:
{index[,width][:formatString]}
Je třeba použít odpovídající složené závorky ({
a }
).
Součást indexu
Povinná komponenta index
, která se označuje také jako specifikátor parametru, je číslo začínající 0, které identifikuje odpovídající položku v seznamu objektů. To znamená, že položka formátu, jejíž specifikátor parametru je 0
, formátuje první objekt v seznamu. Položka formátu, jejíž specifikátor parametru je 1
, formátuje druhý objekt v seznamu a tak dále. Následující příklad obsahuje čtyři specifikátory parametrů, číslované nuly až tři, které představují čísla menší než 10:
string primes = string.Format("Four prime numbers: {0}, {1}, {2}, {3}",
2, 3, 5, 7);
Console.WriteLine(primes);
// The example displays the following output:
// Four prime numbers: 2, 3, 5, 7
Dim primes As String = String.Format("Four prime numbers: {0}, {1}, {2}, {3}",
2, 3, 5, 7)
Console.WriteLine(primes)
'The example displays the following output
' Four prime numbers 2, 3, 5, 7
Více položek formátu může odkazovat na stejný prvek v seznamu objektů zadáním stejného specifikátoru parametru. Můžete například naformátovat stejnou číselnou hodnotu v šestnáctkovém, vědeckém a číselném formátu zadáním složeného řetězce formátu, například , jak "0x{0:X} {0:E} {0:N}"
ukazuje následující příklad:
string multiple = string.Format("0x{0:X} {0:E} {0:N}",
Int64.MaxValue);
Console.WriteLine(multiple);
// The example displays the following output:
// 0x7FFFFFFFFFFFFFFF 9.223372E+018 9,223,372,036,854,775,807.00
Dim multiple As String = String.Format("0x{0:X} {0:E} {0:N}",
Int64.MaxValue)
Console.WriteLine(multiple)
'The example displays the following output
' 0x7FFFFFFFFFFFFFFF 9.223372E+018 9,223,372,036,854,775,807.00
Každá položka formátu může odkazovat na libovolný objekt v seznamu. Pokud existují například tři objekty, můžete druhý, první a třetí objekt naformátovat zadáním složeného řetězce formátu, například {1} {0} {2}
. Objekt, na který položka formátu neodkazuje, se ignoruje. A FormatException je vyvolán za běhu, pokud specifikátor parametru určuje položku mimo hranice seznamu objektů.
Šířková komponenta
Volitelná width
komponenta je podepsané celé číslo označující upřednostňovanou šířku formátovaného pole. Pokud je hodnota width
menší než délka formátovaného řetězce, width
bude ignorována a délka formátovaného řetězce se použije jako šířka pole. Formátovaná data v poli jsou zarovnaná doprava, pokud width
jsou kladná a zarovnaná doleva, pokud width
je záporná. Pokud je potřeba vyplnění, použijí se prázdné znaky. Je-li zadán width
, je čárka vyžadována.
Následující příklad definuje dvě pole, jedno obsahující jména zaměstnanců a druhá obsahující hodiny, které pracovaly za dva týdny. Složený formátovací řetězec zarovná jména doleva v poli o 20 znacích a jejich hodiny doprava v poli o 5 znacích. Standardní formátovací řetězec "N1" formátuje hodiny s jednou desetinnou číslicí.
string[] names = { "Adam", "Bridgette", "Carla", "Daniel",
"Ebenezer", "Francine", "George" };
decimal[] hours = { 40, 6.667m, 40.39m, 82,
40.333m, 80, 16.75m };
Console.WriteLine("{0,-20} {1,5}\n", "Name", "Hours");
for (int counter = 0; counter < names.Length; counter++)
Console.WriteLine("{0,-20} {1,5:N1}", names[counter], hours[counter]);
// The example displays the following output:
// Name Hours
//
// Adam 40.0
// Bridgette 6.7
// Carla 40.4
// Daniel 82.0
// Ebenezer 40.3
// Francine 80.0
// George 16.8
Dim names As String() = {"Adam", "Bridgette", "Carla", "Daniel",
"Ebenezer", "Francine", "George"}
Dim hours As Decimal() = {40, 6.667D, 40.39D, 82,
40.333D, 80, 16.75D}
Console.WriteLine("{0,-20} {1,5}\n", "Name", "Hours")
For counter = 0 To names.Length - 1
Console.WriteLine("{0,-20} {1,5:N1}", names(counter), hours(counter))
Next
'The example displays the following output
' Name Hours
'
' Adam 40.0
' Bridgette 6.7
' Carla 40.4
' Daniel 82.0
' Ebenezer 40.3
' Francine 80.0
' George 16.8
Formátovací komponenta řetězce
Volitelná formatString
komponenta je formátovací řetězec, který je vhodný pro typ formátovaného objektu. Můžete zadat:
- Standardní nebo vlastní řetězec číselného formátu, pokud je odpovídající objekt číselnou hodnotou.
- Standardní nebo vlastní řetězec formátu data a času, pokud je odpovídajícím objektem DateTime objekt.
- Řetězec formátu výčtu , pokud je odpovídající objekt hodnotou výčtu.
Pokud formatString
není zadaný, použije se specifikátor obecného formátu ("G") pro číselný typ, datum a čas nebo typ výčtu. Pokud je zadáno formatString
, je nutné uvést dvojtečku.
Následující tabulka uvádí typy nebo kategorie typů v knihovně tříd .NET, které podporují předdefinovanou sadu formátových řetězců, a poskytuje odkazy na články, které uvádějí podporované řetězce formátu. Formátování řetězců je rozšiřitelný mechanismus, který umožňuje definovat nové formátovací řetězce pro všechny existující typy a definovat sadu formátových řetězců podporovaných typem definovaným aplikací.
Další informace najdete v článcích o rozhraní IFormattable a ICustomFormatter.
Typ nebo kategorie typu | Podívejte se |
---|---|
Typy data a času (DateTime, DateTimeOffset) |
Řetězce standardního formátu data a času Řetězce vlastního formátu data a času |
Typy výčtu (všechny typy odvozené od System.Enum) | Řetězce formátování výčtů |
Číselné typy (BigInteger, Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64) |
Standardní řetězce pro formátování čísel Vlastní řetězce číselného formátu |
Guid | Guid.ToString(String) |
TimeSpan |
Standardní řetězce formátu TimeSpan Vlastní řetězce formátu TimeSpan |
Únik složených závorek
Otevírací a uzavírací složené závorky jsou interpretovány jako začátek a konec položky formátu. Chcete-li zobrazit literální levou složenou závorku nebo pravou složenou závorku, musíte použít escape sekvenci. Zadáním dvou levých složených závorek ({{
) v pevném textu zobrazíte jednu levou složenou závorku ({
) nebo dvou pravých složených závorek (}}
), aby se zobrazila jedna pravá složená závorka (}
).
Escapované složené závorky s položkou formátu se parsují odlišně mezi .NET a .NET Framework.
.SÍŤ
Složené závorky můžou být uvozené kolem položky formátu. Představte si například položku formátu {{{0:D}}}
, která má zobrazit otevírací složenou závorku, číselnou hodnotu ve formátu desetinného čísla a uzavírací složenou závorku. Položka formátu je interpretována následujícím způsobem:
- První dvě otevírací složené závorky (
{{
) jsou escapované a poskytují jednu otevírací závorku. - Další tři znaky (
{0:
) se interpretují jako začátek položky formátu. - Další znak (
D
) je interpretován jako specifikátor standardního číselného formátu Decimal. - Další složená závorka (
}
) se interpretuje jako ukončení položky formátu. - Poslední dvě zavírací závorky jsou uniknuté a vytvářejí jednu zavírací závorku.
- Konečný výsledek, který se zobrazí, je literál řetězec,
{6324}
.
int value = 6324;
string output = string.Format("{{{0:D}}}", value);
Console.WriteLine(output);
// The example displays the following output:
// {6324}
Dim value As Integer = 6324
Dim output As String = String.Format("{{{0:D}}}", value)
Console.WriteLine(output)
'The example displays the following output
' {6324}
.NET Framework
Složené závorky v položce formátu se interpretují postupně v pořadí, v jakém se vyskytují. Interpretace vnořených závorek není podporována.
Způsob interpretace složených závorek může vést k neočekávaným výsledkům. Představte si například položku formátu {{{0:D}}}
, která má zobrazit otevírací složenou závorku, číselnou hodnotu ve formátu desetinného čísla a uzavírací složenou závorku. Položka formátu je však interpretována následujícím způsobem:
- První dvě otevírací složené závorky (
{{
) jsou escapované a poskytují jednu otevírací závorku. - Další tři znaky (
{0:
) se interpretují jako začátek položky formátu. - Další znak (
D
) by byl interpretován jako specifikátor standardního číselného formátu desetinný, ale další dvě uniknuté složené závorky (}}
) poskytují jednu složenou závorku. Vzhledem k tomu, že výsledný řetězec (D}
) není standardní specifikátor číselného formátu, výsledný řetězec se interpretuje jako řetězec vlastního formátu, který znamená zobrazit literálový řetězecD}
. - Poslední složená závorka (
}
) se interpretuje jako konec položky formátu. - Konečný výsledek, který se zobrazí, je literál řetězec,
{D}
. Číselná hodnota, která se má formátovat, se nezobrazí.
int value = 6324;
string output = string.Format("{{{0:D}}}",
value);
Console.WriteLine(output);
// The example displays the following output:
// {D}
Dim value As Integer = 6324
Dim output As String = String.Format("{{{0:D}}}",
value)
Console.WriteLine(output)
'The example displays the following output:
' {D}
Jedním ze způsobů, jak napsat kód, aby nedocházelo k chybné interpretaci uniklých závorek a formátovacích položek, je formátovat závorky a položky samostatně. To znamená, že v první operaci formátu zobrazte literálovou levou složenou závorku. Při další operaci zobrazte výsledek formátované položky a při závěrečné operaci zobrazte doslovnou uzavírací složenou závorku. Tento přístup ilustruje následující příklad:
int value = 6324;
string output = string.Format("{0}{1:D}{2}",
"{", value, "}");
Console.WriteLine(output);
// The example displays the following output:
// {6324}
Dim value As Integer = 6324
Dim output As String = String.Format("{0}{1:D}{2}",
"{", value, "}")
Console.WriteLine(output)
'The example displays the following output:
' {6324}
Zpracování objednávky
Pokud volání složené metody formátování obsahuje IFormatProvider argument, jehož hodnota není null
, modul runtime volá jeho IFormatProvider.GetFormat metodu k vyžádání ICustomFormatter implementace. Pokud metoda může vrátit ICustomFormatter implementaci, je uložena v mezipaměti během volání složené metody formátování.
Každá hodnota v seznamu parametrů, která odpovídá položce formátu, se převede na řetězec následujícím způsobem:
Pokud je hodnota, která má být naformátována,
null
, vrátí se prázdný řetězec String.Empty.Pokud je k dispozici implementace ICustomFormatter, runtime volá její metodu Format. Modul runtime předá metodě hodnotu položky formátu
formatString
(nebonull
, pokud není přítomna). Modul runtime také předá implementaci IFormatProvider metodě. Pokud volání ICustomFormatter.Format metody vrátínull
, provádění pokračuje k dalšímu kroku. V opačném případě je vrácen výsledek volání ICustomFormatter.Format.Pokud hodnota implementuje IFormattable rozhraní, volá se metoda rozhraní ToString(String, IFormatProvider) . Pokud je hodnota v položce formátu
formatString
, předá se metodě. V opačném případě se předánull
. Argument IFormatProvider je určen následujícím způsobem:Pokud je pro číselnou hodnotu volána složená metoda formátování s argumentem bez hodnoty null IFormatProvider , modul runtime požaduje NumberFormatInfo objekt z jeho IFormatProvider.GetFormat metody. Pokud není možné poskytnout jeden, pokud je hodnota argumentu
null
, nebo pokud metoda složeného formátování nemá parametr IFormatProvider, použije se objekt NumberFormatInfo pro aktuální kulturní nastavení.Pro hodnotu data a času, pokud je volána složená metoda formátování s argumentem non-null IFormatProvider , modul runtime vyžádá DateTimeFormatInfo objekt z jeho IFormatProvider.GetFormat metody. V následujících situacích se místo toho použije objekt DateTimeFormatInfo pro aktuální jazykovou verzi.
- Metoda IFormatProvider.GetFormat nemůže zadat DateTimeFormatInfo objekt.
- Hodnota argumentu je
null
. - Složená metoda formátování nemá IFormatProvider parametr.
Pro objekty jiných typů, pokud je volána složená metoda formátování s argumentem IFormatProvider , jeho hodnota je předána přímo implementaci IFormattable.ToString . Jinak se
null
předá implementaci IFormattable.ToString.
Volá se metoda bez
ToString
parametrů typu, která buď přepíše Object.ToString() nebo dědí chování své základní třídy. V tomto případě je formátovací řetězec určenýformatString
komponentou v položce formátu, pokud je k dispozici, ignorován.
Zarovnání se použije po provedení předchozích kroků.
Příklady kódu
Následující příklad ukazuje jeden řetězec vytvořený pomocí složeného formátování a druhý vytvořený pomocí metody objektu ToString
. Oba typy formátování vytvářejí ekvivalentní výsledky.
string formatString1 = string.Format("{0:dddd MMMM}", DateTime.Now);
string formatString2 = DateTime.Now.ToString("dddd MMMM");
Dim formatString1 As String = String.Format("{0:dddd MMMM}", DateTime.Now)
Dim formatString2 As String = DateTime.Now.ToString("dddd MMMM")
Za předpokladu, že aktuální den je čtvrtek v květnu, hodnota obou řetězců v předchozím příkladu je Thursday May
v americké anglické jazykové verzi.
Console.WriteLine zveřejňuje stejné funkce jako String.Format. Jediným rozdílem mezi těmito dvěma metodami je, že String.Format vrátí výsledek jako řetězec, zatímco Console.WriteLine zapíše výsledek do výstupního datového proudu přidruženého k objektu Console . Následující příklad používá metodu Console.WriteLine k formátování hodnoty myNumber
na hodnotu měny:
int myNumber = 100;
Console.WriteLine($"{myNumber:C}");
// The example displays the following output
// if en-US is the current culture:
// $100.00
Dim myNumber As Integer = 100
Console.WriteLine("{0:C}", myNumber)
'The example displays the following output
'if en-US Is the current culture:
' $100.00
Následující příklad ukazuje formátování více objektů, včetně formátování jednoho objektu dvěma různými způsoby:
string myName = "Fred";
Console.WriteLine(string.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}",
myName, DateTime.Now));
// Depending on the current time, the example displays output like the following:
// Name = Fred, hours = 11, minutes = 30
Dim myName As String = "Fred"
Console.WriteLine(String.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}",
myName, DateTime.Now))
'Depending on the current time, the example displays output Like the following:
' Name = Fred, hours = 11, minutes = 30
Následující příklad ukazuje použití šířky ve formátování. Argumenty formátované jsou umístěny mezi svislými znaky pruhu (|
) pro zvýraznění výsledného zarovnání.
string firstName = "Fred";
string lastName = "Opals";
int myNumber = 100;
string formatFirstName = string.Format("First Name = |{0,10}|", firstName);
string formatLastName = string.Format("Last Name = |{0,10}|", lastName);
string formatPrice = string.Format("Price = |{0,10:C}|", myNumber);
Console.WriteLine(formatFirstName);
Console.WriteLine(formatLastName);
Console.WriteLine(formatPrice);
Console.WriteLine();
formatFirstName = string.Format("First Name = |{0,-10}|", firstName);
formatLastName = string.Format("Last Name = |{0,-10}|", lastName);
formatPrice = string.Format("Price = |{0,-10:C}|", myNumber);
Console.WriteLine(formatFirstName);
Console.WriteLine(formatLastName);
Console.WriteLine(formatPrice);
// The example displays the following output on a system whose current
// culture is en-US:
// First Name = | Fred|
// Last Name = | Opals|
// Price = | $100.00|
//
// First Name = |Fred |
// Last Name = |Opals |
// Price = |$100.00 |
Dim firstName As String = "Fred"
Dim lastName As String = "Opals"
Dim myNumber As Integer = 100
Dim formatFirstName As String = String.Format("First Name = |{0,10}|", firstName)
Dim formatLastName As String = String.Format("Last Name = |{0,10}|", lastName)
Dim formatPrice As String = String.Format("Price = |{0,10:C}|", myNumber)
Console.WriteLine(formatFirstName)
Console.WriteLine(formatLastName)
Console.WriteLine(formatPrice)
Console.WriteLine()
formatFirstName = String.Format("First Name = |{0,-10}|", firstName)
formatLastName = String.Format("Last Name = |{0,-10}|", lastName)
formatPrice = String.Format("Price = |{0,-10:C}|", myNumber)
Console.WriteLine(formatFirstName)
Console.WriteLine(formatLastName)
Console.WriteLine(formatPrice)
'The example displays the following output on a system whose current
'culture Is en-US:
' First Name = | Fred|
' Last Name = | Opals|
' Price = | $100.00|
'
' First Name = |Fred |
' Last Name = |Opals |
' Price = |$100.00 |
Viz také
- WriteLine
- String.Format
- Interpolace řetězců (C#)
- Interpolace řetězců (Visual Basic)
- Typy formátování
- řetězce standardního číselného formátu
- Vlastní číselné formátovací řetězce
- Standardní řetězce formátu data a času
- Uživatelsky definované řetězce formátů data a času
- Standardní řetězce formátu TimeSpan
- Vlastní řetězce formátu TimeSpan
- Řetězce formátu výčtu