Составное форматированиеComposite Formatting

В качестве входных данных для составного форматирования в .NET используется список объектов и строка составного формата.The .NET composite formatting feature takes a list of objects and a composite format string as input. Строка составного формата состоит из фиксированного текста, в который включены индексированные местозаполнители, которые называются элементами форматирования и соответствуют объектам из списка.A composite format string consists of fixed text intermixed with indexed placeholders, called format items, that correspond to the objects in the list. Операция форматирования создает результирующую строку, состоящую из исходного фиксированного текста, в который включено строковое представление объектов из списка.The formatting operation yields a result string that consists of the original fixed text intermixed with the string representation of the objects in the list.

Важно!

Вместо использования строк составного формата можно использовать интерполированные строки, если их поддерживает язык и языковая версия, которые вы используете.Instead of using composite format strings, you can use interpolated strings if the language and language version that you're using support them. Интерполированная строка — это строка, которая содержит интерполированные выражения.An interpolated string is a string that contains interpolated expressions. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена.Each interpolated expression is resolved with the expression's value and included in the result string when the string is assigned. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).For more information, see String interpolation (C# Reference) and Interpolated strings (Visual Basic Reference).

Возможность составного форматирования поддерживается следующими методами:The composite formatting feature is supported by methods such as the following:

Строка составного форматаComposite Format String

Строка составного формата и список объектов используются в качестве аргументов методов, поддерживающих составное форматирование.A composite format string and object list are used as arguments of methods that support the composite formatting feature. Строка составного формата состоит из блоков фиксированного текста числом от нуля и больше, перемежаемых одним или несколькими элементами форматирования.A composite format string consists of zero or more runs of fixed text intermixed with one or more format items. Фиксированным текстом может являться произвольная строка, а каждый элемент форматирования должен соответствовать объекту или упакованной структуре из списка.The fixed text is any string that you choose, and each format item corresponds to an object or boxed structure in the list. В ходе составного форматирования создается новая результирующая строка, в которой все элементы форматирования заменены на строковое представление соответствующих объектов из списка.The composite formatting feature returns a new result string where each format item is replaced by the string representation of the corresponding object in the list.

Рассмотрим следующий фрагмент кода Format.Consider the following Format code fragment.

string name = "Fred";
String.Format("Name = {0}, hours = {1:hh}", name, DateTime.Now);
Dim name As String = "Fred"
String.Format("Name = {0}, hours = {1:hh}", name, DateTime.Now)

Здесь "Name =" и ", hours =" — фиксированный текст.The fixed text is "Name = " and ", hours = ". Элементы форматирования — это "{0}" c индексом 0, который соответствует объекту name, и "{1:hh}" с индексом 1, который соответствует объекту DateTime.Now.The format items are "{0}", whose index is 0, which corresponds to the object name, and "{1:hh}", whose index is 1, which corresponds to the object DateTime.Now.

Синтаксис элементов форматированияFormat Item Syntax

Каждый элемент форматирования имеет следующий вид и состоит из следующих компонентов:Each format item takes the following form and consists of the following components:

{ index[,alignment][:formatString]}{ index[,alignment][:formatString]}

Парные фигурные скобки ("{" и "}") здесь обязательны.The matching braces ("{" and "}") are required.

ИндексIndex Component

Обязательный компонент index, также называемый описателем параметра, — это число, определяющее соответствующий объект из списка; индексация элементов ведется от нуля.The mandatory index component, also called a parameter specifier, is a number starting from 0 that identifies a corresponding item in the list of objects. Иными словами, элемент форматирования с индексом 0 отвечает за формат первого объекта в списке, элемент форматирования с индексом 1 служит для форматирования второго объекта в списке и т. д.That is, the format item whose parameter specifier is 0 formats the first object in the list, the format item whose parameter specifier is 1 formats the second object in the list, and so on. В пример ниже входят четыре описателя параметров (с номерами от 0 до 3) для представления простых чисел меньше 10.The following example includes four parameter specifiers, numbered zero through three, to represent prime numbers less than ten:

string primes;
primes = String.Format("Prime numbers less than 10: {0}, {1}, {2}, {3}",
                       2, 3, 5, 7 );
Console.WriteLine(primes);
// The example displays the following output:
//      Prime numbers less than 10: 2, 3, 5, 7
Dim primes As String
primes = String.Format("Prime numbers less than 10: {0}, {1}, {2}, {3}",
                       2, 3, 5, 7 )
Console.WriteLine(primes)
' The example displays the following output:
'      Prime numbers less than 10: 2, 3, 5, 7

На один и тот же элемент в списке объектов может ссылаться сразу несколько элементов форматирования — достигается это путем задания одинакового описателя параметра.Multiple format items can refer to the same element in the list of objects by specifying the same parameter specifier. Например, одно и то же числовое значение можно отформатировать в шестнадцатеричном, экспоненциальном и десятичном виде путем задания следующей строки составного форматирования: "0x{0:X} {0:E} {0:N}", как показано в следующем примере.For example, you can format the same numeric value in hexadecimal, scientific, and number format by specifying a composite format string such as : "0x{0:X} {0:E} {0:N}", as the following example shows.

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

Любой элемент форматирования может ссылаться на произвольный объект списка.Each format item can refer to any object in the list. Например, если имеется три объекта, то можно отформатировать сначала второй, а затем первый и третий объекты, задав следующую строку составного форматирования: "{1} {0} {2}".For example, if there are three objects, you can format the second, first, and third object by specifying a composite format string like this: "{1} {0} {2}". Объекты, на которые не ссылаются элементы форматирования, пропускаются.An object that is not referenced by a format item is ignored. Если описатель параметра ссылается на элемент за пределами списка объектов, то во время выполнения создается исключение FormatException.A FormatException is thrown at runtime if a parameter specifier designates an item outside the bounds of the list of objects.

ВыравниваниеAlignment Component

Необязательный компонент alignment — это целое число со знаком, которое служит для указания желательной ширины поля форматирования.The optional alignment component is a signed integer indicating the preferred formatted field width. Если значение alignment меньше длины форматируемой строки, то alignment пропускается, и в качестве значения ширины поля используется длина форматируемой строки.If the value of alignment is less than the length of the formatted string, alignment is ignored and the length of the formatted string is used as the field width. Форматируемые данные выравниваются в поле по правому краю, если alignment имеет положительное значение, или по левому краю, если alignment имеет отрицательное значение.The formatted data in the field is right-aligned if alignment is positive and left-aligned if alignment is negative. При необходимости отформатированная строка дополняется пробелами.If padding is necessary, white space is used. При использовании компонента alignment необходимо поставить запятую.The comma is required if alignment is specified.

В примере ниже определяются два массива: один содержит имена сотрудников, а второй — количество часов, которые они проработали в течение двух недель.The following example defines two arrays, one containing the names of employees and the other containing the hours they worked over a two-week period. Строка составного формата выравнивает имена по левому краю 20-символьного поля, а часы работы — по правому краю 5-символьного поля.The composite format string left-aligns the names in a 20-character field, and right-aligns their hours in a 5-character field. Обратите внимание, что строка стандартного формата "N1" также используется для форматирования часов с одной цифрой дробной части.Note that the "N1" standard format string is also used to format the hours with one fractional digit.

using System;

public class Example
{
   public static void Main()
   {
      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 ctr = 0; ctr < names.Length; ctr++)
         Console.WriteLine("{0,-20} {1,5:N1}", names[ctr], hours[ctr]);

   }
}
// 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
Module Example
   Public Sub Main()
      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}", "Name", "Hours")
      Console.WriteLine()
      For ctr As Integer = 0 To names.Length - 1
         Console.WriteLine("{0,-20} {1,5:N1}", names(ctr), hours(ctr))
      Next
   End Sub
End Module
' 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

Компонент строки форматаFormat String Component

Необязательный компонент formatString — это строка формата, соответствующая типу форматируемого объекта.The optional formatString component is a format string that is appropriate for the type of object being formatted. Если соответствующий объект является объектом DateTime, используется строка стандартного или настраиваемого формата чисел, а если соответствующий объект является значением перечисления, используется строка формата перечисления.Specify a standard or custom numeric format string if the corresponding object is a numeric value, a standard or custom date and time format string if the corresponding object is a DateTime object, or an enumeration format string if the corresponding object is an enumeration value. Если компонент formatString не задан, то для числовых значений, значений даты и времени, а также перечислений используется общий формат ("G").If formatString is not specified, the general ("G") format specifier for a numeric, date and time, or enumeration type is used. При использовании компонента formatString необходимо двоеточие.The colon is required if formatString is specified.

В следующей таблице перечислены типы и категории типов в библиотеке классов .NET Framework, которые поддерживают предопределенный набор строк формата, а также ссылки на разделы, в которых перечисляются поддерживаемые строки формата.The following table lists types or categories of types in the .NET Framework class library that support a predefined set of format strings, and provides links to the topics that list the supported format strings. Обратите внимание, что форматирование строк — это расширяемый механизм, который позволяет определять новые строки формата для всех существующих типов, а также определять набор строк формата, поддерживаемых прикладным типом.Note that string formatting is an extensible mechanism that makes it possible to define new format strings for all existing types as well as to define a set of format strings supported by an application-defined type. Подробнее см. в разделах, посвященных интерфейсам IFormattable и ICustomFormatter.For more information, see the IFormattable and ICustomFormatter interface topics.

Тип или категория типовType or type category См.See
Типы даты и времени (DateTime, DateTimeOffset)Date and time types (DateTime, DateTimeOffset) Строки стандартных форматов даты и времениStandard Date and Time Format Strings

Строки настраиваемых форматов даты и времениCustom Date and Time Format Strings
Типы перечисления (все типы, производные от System.Enum)Enumeration types (all types derived from System.Enum) Enumeration Format StringsEnumeration Format Strings
Числовые типы (BigInteger, Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64)Numeric types (BigInteger, Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64) Standard Numeric Format StringsStandard Numeric Format Strings

Custom Numeric Format StringsCustom Numeric Format Strings
Guid Guid.ToString(String)
TimeSpan Строки стандартного формата TimeSpanStandard TimeSpan Format Strings

Строки настраиваемого формата TimeSpanCustom TimeSpan Format Strings

Оформление фигурных скобокEscaping Braces

Начало и конец элемента форматирования обозначаются соответственно открывающей и закрывающей фигурной скобкой.Opening and closing braces are interpreted as starting and ending a format item. Это означает, что для вывода открывающих и закрывающих фигурных скобок необходимо использовать escape-последовательности.Consequently, you must use an escape sequence to display a literal opening brace or closing brace. Для вывода открывающей или закрывающей фигурной скобки в фиксированном тексте следует поставить две открывающие или, соответственно, закрывающие фигурные скобки подряд ("{{" или "}}").Specify two opening braces ("{{") in the fixed text to display one opening brace ("{"), or two closing braces ("}}") to display one closing brace ("}"). Фигурные скобки в элементе форматирования интерпретируются последовательно в порядке их обнаружения.Braces in a format item are interpreted sequentially in the order they are encountered. Интерпретация вложенных скобок не поддерживается.Interpreting nested braces is not supported.

Порядок интерпретации скобок может привести к непредвиденным результатам.The way escaped braces are interpreted can lead to unexpected results. Например, рассмотрим элемент форматирования "{{{{0:D}}}}", который должен вывести открывающую фигурную скобку, числовое значение, отформатированное в десятичном виде, и закрывающую фигурную скобку.For example, consider the format item "{{{0:D}}}", which is intended to display an opening brace, a numeric value formatted as a decimal number, and a closing brace. В действительности элемент форматирования будет интерпретирован следующим образом:However, the format item is actually interpreted in the following manner:

  1. Первые две открывающие фигурные скобки ("{{") составляют escape-последовательность, которая дает в итоге одиночную открывающую фигурную скобку.The first two opening braces ("{{") are escaped and yield one opening brace.

  2. Следующие три знака ("{0:") воспринимаются как начало элемента форматирования.The next three characters ("{0:") are interpreted as the start of a format item.

  3. Следующий знак ("D") должен интерпретироваться как указатель на десятичный числовой формат, но стоящая за ним пара фигурных скобок ("}}") дает в результате одиночную фигурную скобку.The next character ("D") would be interpreted as the Decimal standard numeric format specifier, but the next two escaped braces ("}}") yield a single brace. Поскольку результирующая строка ("D}") не является стандартным описателем числового формата, то она будет интерпретирована как строка пользовательского формата, что приведет к выводу строки "D}".Because the resulting string ("D}") is not a standard numeric format specifier, the resulting string is interpreted as a custom format string that means display the literal string "D}".

  4. Последняя фигурная скобка ("}") интерпретируется как конец элемента форматирования.The last brace ("}") is interpreted as the end of the format item.

  5. Итоговый результат, который будет выведен — строка "{D}".The final result that is displayed is the literal string, "{D}". Числовое значение, которое требовалось отформатировать, выведено не будет.The numeric value that was to be formatted is not displayed.

Одним из способов избежать неправильной интерпретации фигурных скобок и элементов форматирования при написании кода является раздельное форматирование фигурных скобок и элементов форматирования.One way to write your code to avoid misinterpreting escaped braces and format items is to format the braces and format item separately. Это означает, что первая операция форматирования должна выводить строку с открывающей фигурной скобкой, следующая операция — результат обработки элемента форматирования, а последняя операция — строку с закрывающей фигурной скобкой.That is, in the first format operation display a literal opening brace, in the next operation display the result of the format item, then in the final operation display a literal closing brace. Этот подход показан в приведенном ниже примере.The following example illustrates this approach.

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}

Порядок обработкиProcessing Order

Если вызов метода составного форматирования содержит аргумент IFormatProvider, значение которого не равно null, среда выполнения вызывает метод IFormatProvider.GetFormat, чтобы запросить реализацию ICustomFormatter.If the call to the composite formatting method includes an IFormatProvider argument whose value is not null, the runtime calls its IFormatProvider.GetFormat method to request an ICustomFormatter implementation. Если метод может возвращать реализацию ICustomFormatter, он кэшируется на время вызова метода составного форматирования.If the method is able to return an ICustomFormatter implementation, it's cached for the duration of the call of the composite formatting method.

Каждое значение в списке параметров, соответствующее элементу форматирования, преобразуется в строку следующим образом:Each value in the parameter list that corresponds to a format item is converted to a string as follows:

  1. Если форматируемое значение является значением null, возвращается пустая строка String.Empty.If the value to be formatted is null, an empty string String.Empty is returned.

  2. Если реализация ICustomFormatter доступна, среда выполнения вызывает ее метод Format.If an ICustomFormatter implementation is available, the runtime calls its Format method. Она передает в метод значение элемента форматирования formatString (при его наличии) или значение null (в случае его отсутствия) вместе с реализацией IFormatProvider.It passes the method the format item's formatString value, if one is present, or null if it's not, along with the IFormatProvider implementation. Если вызов метода ICustomFormatter.Format возвращает null, выполнение переходит к следующему шагу; в противном случае возвращается результат вызова ICustomFormatter.Format.If the call to the ICustomFormatter.Format method returns null, execution proceeds to the next step; otherwise, the result of the ICustomFormatter.Format call is returned.

  3. Если значение реализует интерфейс IFormattable, вызывается метод ToString(String, IFormatProvider) этого интерфейса.If the value implements the IFormattable interface, the interface's ToString(String, IFormatProvider) method is called. Методу передается значение formatString (при его наличии в элементе форматирования) или значение null (в случае его отсутствия).The method is passed the formatString value, if one is present in the format item, or null if it's not. Аргумент IFormatProvider определяется следующим образом:The IFormatProvider argument is determined as follows:

    • Для числового значения, если вызывается метод составного форматирования с аргументом IFormatProvider, не равным null, то среда выполнения запрашивает объект NumberFormatInfo из метода IFormatProvider.GetFormat.For a numeric value, if a composite formatting method with a non-null IFormatProvider argument is called, the runtime requests a NumberFormatInfo object from its IFormatProvider.GetFormat method. Если не удалось предоставить объект, если аргумент имеет значение null или метод составного форматирования не имеет параметра IFormatProvider, то используется объект NumberFormatInfo для языка и региональных параметров текущего потока.If it's unable to supply one, if the value of the argument is null, or if the composite formatting method doesn't have an IFormatProvider parameter, the NumberFormatInfo object for the current thread culture is used.

    • Для значения даты и времени, если вызывается метод составного форматирования с аргументом IFormatProvider, не равным null, то среда выполнения запрашивает объект DateTimeFormatInfo из метода IFormatProvider.GetFormat.For a date and time value, if a composite formatting method with a non-null IFormatProvider argument is called, the runtime requests a DateTimeFormatInfo object from its IFormatProvider.GetFormat method. Если не удалось предоставить объект, если аргумент имеет значение null или метод составного форматирования не имеет параметра IFormatProvider, то используется объект DateTimeFormatInfo для языка и региональных параметров текущего потока.If it's unable to supply one, if the value of the argument is null, or if the composite formatting method doesn't have an IFormatProvider parameter, the DateTimeFormatInfo object for the current thread culture is used.

    • Для объектов других типов, если метод составного форматирования вызывается с аргументом IFormatProvider, то его значение передается непосредственно в реализацию IFormattable.ToString.For objects of other types, if a composite formatting method is called with an IFormatProvider argument, its value is passed directly to the IFormattable.ToString implementation. В противном случае null передается в реализацию IFormattable.ToString.Otherwise, null is passed to the IFormattable.ToString implementation.

  4. Вызывается метод ToString без параметров, который переопределяет Object.ToString() или наследует поведение базового класса.The type's parameterless ToString method, which either overrides Object.ToString() or inherits the behavior of its base class, is called. В этом случае строка формата, указанная в компоненте formatString в элементе форматирования (при его наличии), игнорируется.In this case, the format string specified by the formatString component in the format item, if it's present, is ignored.

После выполнения предшествующих шагов производится выравнивание.Alignment is applied after the preceding steps have been performed.

Примеры кодаCode Examples

В приведенном ниже примере одна строка создается с помощью составного форматирования, а другая – с помощью метода ToString.The following example shows one string created using composite formatting and another created using an object's ToString method. Оба способа форматирования дают идентичные результаты.Both types of formatting produce equivalent results.

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") 

Предположим, что сейчас май, а текущий день недели — четверг. Тогда значение обеих строк в предыдущем примере будет Thursday May для языка и региональных параметров "Английский (США)".Assuming that the current day is a Thursday in May, the value of both strings in the preceding example is Thursday May in the U.S. English culture.

Метод Console.WriteLine предоставляет те же функциональные возможности, что и метод String.Format.Console.WriteLine exposes the same functionality as String.Format. Единственное различие между этими двумя методами состоит в том, что метод String.Format возвращает результаты в виде строки, а метод Console.WriteLine записывает результаты в поток вывода, связанный с объектом Console.The only difference between the two methods is that String.Format returns its result as a string, while Console.WriteLine writes the result to the output stream associated with the Console object. В следующем примере для форматирования значения переменной Console.WriteLine в виде денежного значения используется метод MyInt.The following example uses the Console.WriteLine method to format the value of MyInt to a currency value.

int MyInt = 100;
Console.WriteLine("{0:C}", MyInt);
// The example displays the following output 
// if en-US is the current culture:
//        $100.00
Dim MyInt As Integer = 100
Console.WriteLine("{0:C}", MyInt)
' The example displays the following output
' if en-US is the current culture:
'        $100.00

В следующем примере демонстрируется форматирование нескольких объектов, в том числе форматирование одного и того же объекта двумя разными способами.The following example demonstrates formatting multiple objects, including formatting one object two different ways.

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                 

В следующем примере показывается использование выравнивания при форматировании.The following example demonstrates the use of alignment in formatting. Форматируемые аргументы разделены знаками вертикальной черты ("|"), которые иллюстрируют выравнивание.The arguments that are formatted are placed between vertical bar characters (|) to highlight the resulting alignment.

string myFName = "Fred";
string myLName = "Opals";
int myInt = 100;
string FormatFName = String.Format("First Name = |{0,10}|", myFName);
string FormatLName = String.Format("Last Name = |{0,10}|", myLName);
string FormatPrice = String.Format("Price = |{0,10:C}|", myInt); 
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);
Console.WriteLine();

FormatFName = String.Format("First Name = |{0,-10}|", myFName);
FormatLName = String.Format("Last Name = |{0,-10}|", myLName);
FormatPrice = String.Format("Price = |{0,-10:C}|", myInt);
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
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 myFName As String = "Fred"
   Dim myLName As String = "Opals"

   Dim myInt As Integer = 100
   Dim FormatFName As String = String.Format("First Name = |{0,10}|", myFName)
   Dim FormatLName As String = String.Format("Last Name = |{0,10}|", myLName)
   Dim FormatPrice As String = String.Format("Price = |{0,10:C}|", myInt)
   Console.WriteLine(FormatFName)
   Console.WriteLine(FormatLName)
   Console.WriteLine(FormatPrice)
   Console.WriteLine()
   
   FormatFName = String.Format("First Name = |{0,-10}|", myFName)
   FormatLName = String.Format("Last Name = |{0,-10}|", myLName)
   FormatPrice = String.Format("Price = |{0,-10:C}|", myInt)
   Console.WriteLine(FormatFName)
   Console.WriteLine(FormatLName)
   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   |

См. такжеSee also