String.Format Метод

Определение

Преобразует значения объектов в строки на основе указанных форматов и вставляет их в другую строку.

Если вы не знакомы с методом String.Format, см. краткие сведения в разделе Начало работы с методом String.Format.

В разделе Примечания приводится общая документация для метода String.Format.

Перегрузки

Format(String, Object)

Заменяет один или более элементов формата в строке строковым представлением указанного объекта.

Format(String, Object[])

Заменяет элемент формата в указанной строке строковым представлением соответствующего объекта в указанном массиве.

Format(IFormatProvider, String, Object)

Заменяет элементы формата в указанной строке строковым представлением соответствующего объекта. Параметр предоставляет сведения об особенностях форматирования, связанных с языком и региональными параметрами.

Format(IFormatProvider, String, Object[])

Заменяет элементы формата в строке строковым представлениями соответствующих объектов в указанном массиве. Параметр предоставляет сведения об особенностях форматирования, связанных с языком и региональными параметрами.

Format(String, Object, Object)

Заменяет элементы формата в строке строковым представлением двух указанных объектов.

Format(IFormatProvider, String, Object, Object)

Заменяет элементы формата в строке строковым представлением двух указанных объектов. Параметр предоставляет сведения об особенностях форматирования, связанных с языком и региональными параметрами.

Format(String, Object, Object, Object)

Заменяет элементы формата в строке строковым представлением трех указанных объектов.

Format(IFormatProvider, String, Object, Object, Object)

Заменяет элементы формата в строке строковым представлением трех указанных объектов. Параметр предоставляет сведения об особенностях форматирования, связанных с языком и региональными параметрами.

Примеры

Многочисленные примеры вызова Format метода приведены в разделе « Примечания » этой статьи.

Вы также можете скачать полный набор String.Format примеров, включающих проект .NET Core для C#.

Ниже приведены некоторые примеры, представленные в статье.

Создание строки формата

Вставка строки
Элемент форматирования
Форматирование элементов с одинаковым индексом

Управление форматированным выводом

Управление форматированием
Управление промежутками
Управление выравниванием
Управление числом целочисленных цифр
Управление числом цифр после десятичного разделителя
Включение литеральных скобок в результирующую строку

Создание строк формата с учетом языка и региональных параметров

Форматирование с учетом языка и региональных параметров

Настройка операции форматирования

Пользовательская операция форматирования
Модуль форматирования для поставщика перехвата и римских чисел

Комментарии

Важно!

Вместо вызова метода String.Format или использования строк составного формата можно использовать интерполированные строки, если ваш язык их поддерживает. Интерполированная строка — это строка, которая содержит интерполированные выражения. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).

Содержание

Начало работы с методом String. Format
Какой метод следует вызывать?
Метод Format в кратком виде
Элемент форматирования
Форматирование аргументов
Форматирование элементов с одинаковым индексом
Форматирование и культура
Пользовательские операции форматирования
Строка. формат Q & A

Начало работы с методом String. Format

Используйте String.Format , если необходимо вставить значение объекта, переменной или выражения в другую строку. Например, можно вставить значение Decimal значения в строку, чтобы отобразить его для пользователя в виде одной строки:

Decimal pricePerOunce = (Decimal)17.36;
String^ s = String::Format("The current price is {0} per ounce.",
                           pricePerOunce);
// Result: The current price is 17.36 per ounce.
Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0} per ounce.",
                         pricePerOunce);
Console.WriteLine(s);
// Result: The current price is 17.36 per ounce.
Dim pricePerOunce As Decimal = 17.36d
Dim s As String = String.Format("The current price is {0} per ounce.",
                                pricePerOunce)
' Result: The current price is 17.36 per ounce.

Вы можете контролировать форматирование этого значения:

Decimal pricePerOunce = (Decimal)17.36;
String^ s = String::Format("The current price is {0:C2} per ounce.",
                           pricePerOunce);
// Result if current culture is en-US:
//      The current price is $17.36 per ounce.
Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0:C2} per ounce.",
                         pricePerOunce);
Console.WriteLine(s);
// Result if current culture is en-US:
//      The current price is $17.36 per ounce.
Dim pricePerOunce As Decimal = 17.36d
Dim s As String = String.Format("The current price is {0:C2} per ounce.",
                                pricePerOunce)
' Result if current culture is en-US:
'      The current price is $17.36 per ounce.

Помимо форматирования, можно также управлять выравниванием и отступами.

Вставка строки

String.Format начинается со строки формата, за которой следуют один или несколько объектов или выражений, которые будут преобразованы в строки и вставлены в указанное место в строке формата. Пример:

Decimal temp = (Decimal)20.4;
String^ s = String::Format("The temperature is {0}°C.", temp);
Console::WriteLine(s);
// Displays 'The temperature is 20.4°C.'
decimal temp = 20.4m;
string s = String.Format("The temperature is {0}°C.", temp);
Console.WriteLine(s);
// Displays 'The temperature is 20.4°C.'
Dim temp As Decimal = 20.4d
Dim s As String = String.Format("The temperature is {0}°C.", temp)
Console.WriteLine(s)
' Displays 'The temperature is 20.4°C.'

{0}В строке формата используется элемент формата. 0 Индекс объекта, строковое значение которого будет вставлено в этой позиции. (Индексы начинаются с 0.) Если вставляемый объект не является строкой, ToString вызывается его метод, чтобы преобразовать его в одну, прежде чем вставить в результирующую строку.

Вот еще один пример, в котором используются два элемента формата и два объекта в списке объектов:

String^ s = String::Format("At {0}, the temperature is {1}°C.",
                           DateTime::Now, 20.4);
// Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'
string s = String.Format("At {0}, the temperature is {1}°C.",
                         DateTime.Now, 20.4);
Console.WriteLine(s);
// Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'
Dim s As String = String.Format("At {0}, the temperature is {1}°C.",
                                Date.Now, 20.4)
' Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'

Количество элементов формата и количество объектов в списке объектов может быть любым, пока индекс каждого элемента формата имеет соответствующий объект в списке объектов. Кроме того, не нужно беспокоиться о том, какая перегрузка вызывается. компилятор выберет подходящий для вас.

Форматирование элементов управления

Для управления форматированием объекта можно следовать индексу в элементе форматирования со строкой формата. Например, {0:d} строка формата "d" применяется к первому объекту в списке объектов. Ниже приведен пример с одним объектом и двумя элементами форматирования:

String^ s = String::Format("It is now {0:d} at {0:t}",
                           DateTime::Now);
// Output similar to: 'It is now 4/10/2015 at 10:04 AM'
string s = String.Format("It is now {0:d} at {0:t}", DateTime.Now);
Console.WriteLine(s);
// Output similar to: 'It is now 4/10/2015 at 10:04 AM'
Dim s As String = String.Format("It is now {0:d} at {0:t}",
                                Date.Now)
' Output similar to: 'It is now 4/10/2015 at 10:04 AM'

Ряд типов поддерживает строки формата, включая все числовые типы ( стандартные и Настраиваемые строки формата), все даты и время ( стандартные и настраиваемые строки формата) и интервалы времени ( стандартные и Настраиваемые строки формата), все типы перечисления и идентификаторы GUID. Также можно добавить поддержку строк формата для собственных типов.

Контрольные промежутки

Можно определить ширину строки, вставляемой в результирующую строку, с помощью синтаксиса, такого как {0,12} , который вставляет 12-символьную строку. В этом случае строковое представление первого объекта выдается по правому краю в 12-символьном поле. (Если длина строкового представления первого объекта превышает 12 символов, то ширина предпочтительного поля игнорируется, а вся строка вставляется в результирующую строку.)

В следующем примере определяется 6-символьное поле для хранения строки "Year" и некоторых строк года, а также 15-символьного поля для хранения строки "Population" и некоторых данных о населении. Обратите внимание, что символы вычисляются по правому краю поля.

array<int>^ years = { 2013, 2014, 2015 };
array<int>^ population = { 1025632, 1105967, 1148203 };
StringBuiler^ sb = gcnew StringBuilder();
sb->Append(String::Format("{0,6} {1,15}\n\n", "Year", "Population"));
for(int index = 0; index < years->Length; index++)
   sb->AppendFormat("{0,6} {1,15:N0}\n",
                    years[index], population[index]);
// Result:
//      Year      Population
//
//      2013       1,025,632
//      2014       1,105,967
//      2015       1,148,203
     int[] years = { 2013, 2014, 2015 };
     int[] population = { 1025632, 1105967, 1148203 };
     var sb = new System.Text.StringBuilder();
     sb.Append(String.Format("{0,6} {1,15}\n\n", "Year", "Population"));
     for (int index = 0; index < years.Length; index++)
        sb.Append(String.Format("{0,6} {1,15:N0}\n", years[index], population[index]));

     Console.WriteLine(sb);

     // Result:
     //      Year      Population
     //
     //      2013       1,025,632
     //      2014       1,105,967
     //      2015       1,148,203
Dim years() As Integer = { 2013, 2014, 2015 }
Dim population() As Integer  = { 1025632, 1105967, 1148203 }
Dim sb As New StringBuilder()
sb.Append(String.Format("{0,6} {1,15}{2}{2}",
                        "Year", "Population", vbCrLf))
For index As Integer = 0 To years.Length - 1
   sb.AppendFormat("{0,6} {1,15:N0}{2}",
                   years(index), population(index), vbCrLf)
Next
' Result:
'      Year      Population
'
'      2013       1,025,632
'      2014       1,105,967
'      2015       1,148,203

Выравнивание элемента управления

По умолчанию строки выводятся по правому краю в поле, если задана ширина поля. Для выровняйте строки по левому краю в поле Ширина поля предшествует знаку минус, например, {0,-12} для определения 12-символьного поля, выравниваемая по левому краю.

Следующий пример аналогичен предыдущему, за исключением того, что он по левому краю выдает как метки, так и данные.

array<int>^ years = { 2013, 2014, 2015 };
array<int>^ population = { 1025632, 1105967, 1148203 };
String^ s = String::Format("{0,-10} {1,-10}\n\n", "Year", "Population");
for(int index = 0; index < years->Length; index++)
   s += String::Format("{0,-10} {1,-10:N0}\n",
                      years[index], population[index]);
// Result:
//    Year       Population
//
//    2013       1,025,632
//    2014       1,105,967
//    2015       1,148,203
int[] years = { 2013, 2014, 2015 };
int[] population = { 1025632, 1105967, 1148203 };
String s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population");
for(int index = 0; index < years.Length; index++)
   s += String.Format("{0,-10} {1,-10:N0}\n",
                      years[index], population[index]);
Console.WriteLine($"\n{s}");
// Result:
//    Year       Population
//
//    2013       1,025,632
//    2014       1,105,967
//    2015       1,148,203
Dim years() As Integer = { 2013, 2014, 2015 }
Dim population() As Integer  = { 1025632, 1105967, 1148203 }
Dim s As String = String.Format("{0,-10} {1,-10}{2}{2}",
                                "Year", "Population", vbCrLf)
For index As Integer = 0 To years.Length - 1
   s += String.Format("{0,-10} {1,-10:N0}{2}",
                      years(index), population(index), vbCrLf)
Next
' Result:
'    Year       Population
'
'    2013       1,025,632
'    2014       1,105,967
'    2015       1,148,203

String.Format использует функцию составного форматирования. Дополнительные сведения см. в разделе Составное форматирование.

Какой метод следует вызывать?

Кому Call
Форматирование одного или нескольких объектов с помощью соглашений текущего языка и региональных параметров. За исключением перегрузок, включающих provider параметр, остальные Format перегрузки включают параметр, String за которым следует один или несколько параметров объекта. Поэтому не нужно определять, какую Format перегрузку нужно вызвать. Языковой компилятор выбирает подходящую перегрузку из перегрузок, у которых нет provider параметра, в зависимости от списка аргументов. Например, если список аргументов содержит пять аргументов, компилятор вызывает Format(String, Object[]) метод.
Форматирование одного или нескольких объектов с помощью соглашений определенного языка и региональных параметров. FormatЗа каждой перегрузкой, которая начинается с provider параметра, следует String параметр и один или несколько параметров объекта. По этой причине не нужно определять, какую конкретную Format перегрузку вы хотите вызвать. Языковой компилятор выбирает подходящую перегрузку из перегрузок, имеющих provider параметр, на основе списка аргументов. Например, если список аргументов содержит пять аргументов, компилятор вызывает Format(IFormatProvider, String, Object[]) метод.
Выполните операцию пользовательского форматирования либо с ICustomFormatter реализацией, либо с IFormattable реализацией. Любая из четырех перегрузок с provider параметром. Компилятор выбирает подходящую перегрузку из перегрузок, имеющих provider параметр, на основе списка аргументов.

Метод Format в кратком виде

Каждая перегрузка Format метода использует функцию составного форматирования для включения индексируемых от нуля заполнителей, которые называются элементами форматирования, в строке составного формата. Во время выполнения каждый элемент форматирования заменяется строковым представлением соответствующего аргумента в списке параметров. Если аргумент имеет значение null , элемент форматирования заменяется на String.Empty . Например, следующий вызов Format(String, Object, Object, Object) метода включает строку формата с тремя элементами форматирования,, {0} {1} , и {2} , а также список аргументов с тремя элементами.

using namespace System;

void main()
{
   DateTime^ dat = gcnew DateTime(2012, 1, 17, 9, 30, 0); 
   String^ city = "Chicago";
   int temp = -16;
   String^ output = String::Format("At {0} in {1}, the temperature was {2} degrees.",
                                   dat, city, temp);
   Console::WriteLine(output);
}
// The example displays the following output: 
//    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.
DateTime dat = new DateTime(2012, 1, 17, 9, 30, 0); 
string city = "Chicago";
int temp = -16;
string output = String.Format("At {0} in {1}, the temperature was {2} degrees.",
                              dat, city, temp);
Console.WriteLine(output);
// The example displays output like the following:
//    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.
Dim dat As Date = #1/17/2012 9:30AM# 
Dim city As String = "Chicago"
Dim temp As Integer = -16
Dim output As String = String.Format("At {0} in {1}, the temperature was {2} degrees.",
                                     dat, city, temp)
Console.WriteLine(output)
' The example displays the following output:
'    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.

Элемент форматирования

Элемент форматирования имеет следующий синтаксис:

{index[,alignment][:formatString]}

Скобки обозначают необязательные элементы. Открывающие и закрывающие фигурные скобки являются обязательными. (Чтобы включить в строку формата открывающую или закрывающую фигурную скобку, см. раздел экранирование фигурных скобок в статье составного форматирования .)

Например, элемент форматирования для форматирования значения валюты может выглядеть следующим образом:

String::Format("{0,-10:C}", (Decimal) 126347.89);
var value = String.Format("{0,-10:C}", 126347.89m);         
Console.WriteLine(value);
String.Format("{0,-10:C}", 126347.89d)

Элемент форматирования содержит следующие элементы:

index
Отсчитываемый от нуля индекс аргумента, строковое представление которого должен быть включен в данную точку в строке. Если этот аргумент имеет значение null , в этой позиции в строке будет включена пустая строка.

Выравнивание
Необязательный параметр. Целое число со знаком, указывающее общую длину поля, в которое вставляется аргумент, а также выровняйте его по правому краю (положительное целое число) или по левому краю (отрицательное целое число). Если параметр alignment опущен, строковое представление соответствующего аргумента вставляется в поле без начальных или конечных пробелов.

Если значение выравнивания меньше длины аргумента, которое необходимо вставить, Выравнивание игнорируется, а длина строкового представления аргумента используется в качестве ширины поля.

formatString
Необязательный параметр. Строка, указывающая формат результирующей строки соответствующего аргумента. Если опустить параметр FormatString, ToString для создания строкового представления вызывается метод без параметров соответствующего аргумента. При указании FormatString аргумент, на который ссылается элемент форматирования, должен реализовывать IFormattable интерфейс. Типы, поддерживающие строки формата, включают:

Однако обратите внимание, что любой пользовательский тип может реализовать IFormattable или расширить реализацию существующего типа IFormattable .

В следующем примере alignment formatString для создания форматированного вывода используются аргументы и.

using namespace System;

void main()
{
   // Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
   array<Tuple<String^, DateTime, int, DateTime, int>^>^ cities = gcnew array<Tuple<String^, DateTime, int, DateTime, int>^> 
         { gcnew Tuple<String^, DateTime, int, DateTime, int>("Los Angeles", DateTime(1940, 1, 1), 1504277, 
                        DateTime(1950, 1, 1), 1970358),
         gcnew Tuple<String^, DateTime, int, DateTime, int>("New York", DateTime(1940, 1, 1), 7454995, 
                        DateTime(1950, 1, 1), 7891957),  
         gcnew Tuple<String^, DateTime, int, DateTime, int>("Chicago", DateTime(1940, 1, 1), 3396808, 
                        DateTime(1950, 1, 1), 3620962),  
         gcnew Tuple<String^, DateTime, int, DateTime, int>("Detroit", DateTime(1940, 1, 1), 1623452, 
                        DateTime(1950, 1, 1), 1849568) };

   // Display header
   String^ header = String::Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
                                   "City", "Year", "Population", "Change (%)");
   Console::WriteLine(header);
   String^ output;      
   for each (Tuple<String^, DateTime, int, DateTime, int>^ city in cities) {
      output = String::Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                              city->Item1, city->Item2, city->Item3, city->Item4, city->Item5,
                              (city->Item5 - city->Item3)/ (double)city->Item3);
      Console::WriteLine(output);
   }
}
// The example displays the following output:
//    City            Year  Population    Year  Population    Change (%)
//    
//    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 %
//    New York        1940   7,454,995    1950   7,891,957         5.9 %
//    Chicago         1940   3,396,808    1950   3,620,962         6.6 %
//    Detroit         1940   1,623,452    1950   1,849,568        13.9 %
// Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
Tuple<string, DateTime, int, DateTime, int>[] cities = 
    { Tuple.Create("Los Angeles", new DateTime(1940, 1, 1), 1504277, 
                   new DateTime(1950, 1, 1), 1970358),
      Tuple.Create("New York", new DateTime(1940, 1, 1), 7454995, 
                   new DateTime(1950, 1, 1), 7891957),  
      Tuple.Create("Chicago", new DateTime(1940, 1, 1), 3396808, 
                   new DateTime(1950, 1, 1), 3620962),  
      Tuple.Create("Detroit", new DateTime(1940, 1, 1), 1623452, 
                   new DateTime(1950, 1, 1), 1849568) };

// Display header
var header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
                              "City", "Year", "Population", "Change (%)");
Console.WriteLine(header);
foreach (var city in cities) {
   var output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                          city.Item1, city.Item2, city.Item3, city.Item4, city.Item5,
                          (city.Item5 - city.Item3)/ (double)city.Item3);
   Console.WriteLine(output);
}
// The example displays the following output:
//    City            Year  Population    Year  Population    Change (%)
//  
//    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 %
//    New York        1940   7,454,995    1950   7,891,957         5.9 %
//    Chicago         1940   3,396,808    1950   3,620,962         6.6 %
//    Detroit         1940   1,623,452    1950   1,849,568        13.9 %
Module Example
   Public Sub Main()
      ' Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
      Dim cities()  = _
          { Tuple.Create("Los Angeles", #1/1/1940#, 1504277, #1/1/1950#, 1970358),
            Tuple.Create("New York", #1/1/1940#, 7454995, #1/1/1950#, 7891957),  
            Tuple.Create("Chicago", #1/1/1940#, 3396808, #1/1/1950#, 3620962),  
            Tuple.Create("Detroit", #1/1/1940#, 1623452, #1/1/1950#, 1849568) }

      ' Display header
      Dim header As String = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}",
                                           "City", "Year", "Population", "Change (%)")
      Console.WriteLine(header)
      Console.WriteLine()
      For Each city In cities
         Dim output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                                city.Item1, city.Item2, city.Item3, city.Item4, city.Item5,
                                (city.Item5 - city.Item3)/city.Item3)
         Console.WriteLine(output)
      Next
   End Sub
End Module
' The example displays the following output:
'    City            Year  Population    Year  Population    Change (%)
'    
'    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 %
'    New York        1940   7,454,995    1950   7,891,957         5.9 %
'    Chicago         1940   3,396,808    1950   3,620,962         6.6 %
'    Detroit         1940   1,623,452    1950   1,849,568        13.9 %

Форматирование аргументов

Элементы формата обрабатываются последовательно с начала строки. Каждый элемент формата имеет индекс, соответствующий объекту в списке аргументов метода. FormatМетод извлекает аргумент и наследует его строковое представление следующим образом:

  • Если аргумент имеет значение null , метод вставляет String.Empty в результирующую строку. Не нужно беспокоиться NullReferenceException об обработке аргументов для NULL.

  • Если вызывается Format(IFormatProvider, String, Object[]) перегрузка, а provider Реализация объекта IFormatProvider.GetFormat возвращает реализацию, не равную NULL ICustomFormatter , аргумент передается в ICustomFormatter.Format(String, Object, IFormatProvider) метод. Если элемент форматирования содержит аргумент FormatString , он передается в метод в качестве первого аргумента. Если ICustomFormatter реализация доступна и создает строку, отличную от NULL, то эта строка возвращается в виде строкового представления аргумента. в противном случае выполняется следующий шаг.

  • Если аргумент реализует IFormattable интерфейс, IFormattable.ToString вызывается его реализация.

  • ToStringВызывается метод без параметров, который либо переопределяет, либо наследует от реализации базового класса.

Пример, который перехватывает вызовы к ICustomFormatter.Format методу и позволяет увидеть, какие сведения Format метод передает методу форматирования для каждого элемента форматирования в строке составного формата, см. Пример: поставщик перехвата и модуль форматирования римских чисел.

Дополнительные сведения см. в разделе порядок обработки статьи составное форматирование .

Форматирование элементов с одинаковым индексом

FormatМетод создает исключение, FormatException Если индекс элемента индекса больше или равен числу аргументов в списке аргументов. Однако format может включать больше элементов форматирования, чем количество аргументов, пока несколько элементов формата имеют одинаковый индекс. При вызове Format(String, Object) метода в следующем примере список аргументов содержит один аргумент, но строка формата включает два элемента форматирования: один отображает десятичное значение числа, а другое — его шестнадцатеричное значение.

short[] values= { Int16.MinValue, -27, 0, 1042, Int16.MaxValue };
Console.WriteLine("{0,10}  {1,10}\n", "Decimal", "Hex");
foreach (short value in values)
{
   string formatString = String.Format("{0,10:G}: {0,10:X}", value);
   Console.WriteLine(formatString);
}   
// The example displays the following output:
//       Decimal         Hex
//    
//        -32768:       8000
//           -27:       FFE5
//             0:          0
//          1042:        412
//         32767:       7FFF
Module Example
   Public Sub Main()
      Dim values() As Short = { Int16.MinValue, -27, 0, 1042, Int16.MaxValue }
      Console.WriteLine("{0,10}  {1,10}", "Decimal", "Hex")
      Console.WriteLine()
      For Each value As Short In values
         Dim formatString As String = String.Format("{0,10:G}: {0,10:X}", value)
         Console.WriteLine(formatString)
      Next        
   End Sub
End Module
' The example displays the following output:
'       Decimal         Hex
'    
'        -32768:       8000
'           -27:       FFE5
'             0:          0
'          1042:        412
'         32767:       7FFF

Формат и культура

Как правило, объекты в списке аргументов преобразуются в их строковые представления с использованием правил текущего языка и региональных параметров, возвращаемых CultureInfo.CurrentCulture свойством. Это поведение можно контролировать, вызвав одну из перегрузок Format , которая включает provider параметр. providerПараметр — это IFormatProvider реализация, которая предоставляет сведения об особенностях форматирования для пользовательского и языка и региональных параметров, которые используются для среднего процесса форматирования.

IFormatProviderИнтерфейс содержит один элемент, GetFormat который отвечает за возврат объекта, предоставляющего сведения о форматировании. В .NET есть три IFormatProvider реализации, которые обеспечивают форматирование для конкретного языка и региональных параметров:

  • CultureInfo. Его GetFormat метод возвращает объект, зависящий от языка и региональных параметров, NumberFormatInfo для форматирования числовых значений и объект, зависящий от языка и региональных параметров, DateTimeFormatInfo для форматирования значений даты и времени.

  • DateTimeFormatInfo, который используется для форматирования значений даты и времени, связанных с языком и региональными параметрами. Его GetFormat метод возвращает сам себя.

  • NumberFormatInfo, который используется для форматирования числовых значений в зависимости от языка и региональных параметров. Его GetFormat свойство возвращает само себя.

Пользовательские операции форматирования

Можно также вызвать любую из перегрузок Format метода, имеющего provider параметр типа, IFormatProvider для выполнения пользовательских операций форматирования. Например, можно отформатировать целое число как идентификационный номер или как номер телефона. Для выполнения пользовательского форматирования provider аргумент должен реализовывать IFormatProvider ICustomFormatter интерфейсы и. Когда Format методу передается ICustomFormatter реализация в качестве provider аргумента, Format метод вызывает его IFormatProvider.GetFormat реализацию и запрашивает объект типа ICustomFormatter . Затем он вызывает метод возвращенного ICustomFormatter объекта Format для форматирования каждого элемента формата в составной строке, передаваемой ему.

Дополнительные сведения о предоставлении пользовательских решений по форматированию см. в разделе как определить и использовать поставщики настраиваемых числовых форматов и ICustomFormatter . Пример преобразования целых чисел в форматированные пользовательские числа см. в разделе Пример: операция пользовательского форматирования. Пример преобразования неподписанных байтов в римские цифры см. в разделе Пример: поставщик перехвата и модуль форматирования римских чисел.

Пример. операция пользовательского форматирования

В этом примере определяется поставщик формата, который форматирует целочисленное значение как номер счета клиента в формате x-XXXXX-XX.

using namespace System;

ref class CustomerFormatter : IFormatProvider, ICustomFormatter
{
public:
   virtual Object^ GetFormat(Type^ formatType) 
   {
      if (formatType == ICustomFormatter::typeid)        
         return this; 
      else 
         return nullptr; 
   }
   
   virtual String^ Format(String^ format, 
                   Object^ arg, 
                   IFormatProvider^ formatProvider) 
   {                       
      if (! this->Equals(formatProvider))
      {
         return nullptr;
      }
      else
      {
         if (String::IsNullOrEmpty(format)) 
            format = "G";
         
         String^ customerString = arg->ToString();
         if (customerString->Length < 8)
            customerString = customerString->PadLeft(8, '0');
         
         format = format->ToUpper();
         if (format == L"G") 
               return customerString->Substring(0, 1) + "-" +
                                     customerString->Substring(1, 5) + "-" +
                                     customerString->Substring(6);
         else if (format == L"S")                          
               return customerString->Substring(0, 1) + "/" +
                                     customerString->Substring(1, 5) + "/" +
                                     customerString->Substring(6);
         else if (format == L"P")
               return customerString->Substring(0, 1) + "." +
                                     customerString->Substring(1, 5) + "." +
                                     customerString->Substring(6);
         else
               throw gcnew FormatException( 
                         String::Format("The '{0}' format specifier is not supported.", format));
         }
    }   
};

void main()
{
   int acctNumber = 79203159;
   Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0}", acctNumber));
   Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:G}", acctNumber));
   Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:S}", acctNumber));
   Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:P}", acctNumber));
   try {
      Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:X}", acctNumber));
   }
   catch (FormatException^ e) {
      Console::WriteLine(e->Message);
   }
}
// The example displays the following output:
//       7-92031-59
//       7-92031-59
//       7/92031/59
//       7.92031.59
//       The 'X' format specifier is not supported.
using System;

public class TestFormatter
{
   public static void Main()
   {
      int acctNumber = 79203159;
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:G}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:S}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:P}", acctNumber));
      try {
         Console.WriteLine(String.Format(new CustomerFormatter(), "{0:X}", acctNumber));
      }
      catch (FormatException e) {
         Console.WriteLine(e.Message);
      }
   }
}

public class CustomerFormatter : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType) 
   {
      if (formatType == typeof(ICustomFormatter))        
         return this; 
      else
         return null;
   }
   
   public string Format(string format, 
                         object arg, 
                         IFormatProvider formatProvider) 
   {                       
      if (! this.Equals(formatProvider))
      {
         return null;
      }
      else
      {
         if (String.IsNullOrEmpty(format)) 
            format = "G";
         
         string customerString = arg.ToString();
         if (customerString.Length < 8)
            customerString = customerString.PadLeft(8, '0');
         
         format = format.ToUpper();
         switch (format)
         {
            case "G":
               return customerString.Substring(0, 1) + "-" +
                                     customerString.Substring(1, 5) + "-" +
                                     customerString.Substring(6);
            case "S":                          
               return customerString.Substring(0, 1) + "/" +
                                     customerString.Substring(1, 5) + "/" +
                                     customerString.Substring(6);
            case "P":                          
               return customerString.Substring(0, 1) + "." +
                                     customerString.Substring(1, 5) + "." +
                                     customerString.Substring(6);
            default:
               throw new FormatException( 
                         String.Format("The '{0}' format specifier is not supported.", format));
         }
      }   
   }
}
// The example displays the following output:
//       7-92031-59
//       7-92031-59
//       7/92031/59
//       7.92031.59
//       The 'X' format specifier is not supported.
Module TestFormatter
   Public Sub Main()
      Dim acctNumber As Integer = 79203159
      Console.WriteLine(String.Format(New CustomerFormatter, "{0}", acctNumber))
      Console.WriteLine(String.Format(New CustomerFormatter, "{0:G}", acctNumber))
      Console.WriteLine(String.Format(New CustomerFormatter, "{0:S}", acctNumber))
      Console.WriteLine(String.Format(New CustomerFormatter, "{0:P}", acctNumber))
      Try
         Console.WriteLine(String.Format(New CustomerFormatter, "{0:X}", acctNumber))
      Catch e As FormatException
         Console.WriteLine(e.Message)
      End Try   
   End Sub
End Module

Public Class CustomerFormatter : Implements IFormatProvider, ICustomFormatter
   Public Function GetFormat(type As Type) As Object  _
                   Implements IFormatProvider.GetFormat
      If type Is GetType(ICustomFormatter) Then
         Return Me
      Else
         Return Nothing
      End If
   End Function
   
   Public Function Format(fmt As String, _
                           arg As Object, _
                           formatProvider As IFormatProvider) As String _
                    Implements ICustomFormatter.Format
      If Not Me.Equals(formatProvider) Then
         Return Nothing
      Else
         If String.IsNullOrEmpty(fmt) Then fmt = "G"
         
         Dim customerString As String = arg.ToString()
         if customerString.Length < 8 Then _
            customerString = customerString.PadLeft(8, "0"c)
         
         Select Case fmt
            Case "G"
               Return customerString.Substring(0, 1) & "-" & _
                                     customerString.Substring(1, 5) & "-" & _
                                     customerString.Substring(6)
            Case "S"                         
               Return customerString.Substring(0, 1) & "/" & _
                                     customerString.Substring(1, 5) & "/" & _
                                     customerString.Substring(6)
            Case "P"
               Return customerString.Substring(0, 1) & "." & _
                                     customerString.Substring(1, 5) & "." & _
                                     customerString.Substring(6)
            Case Else
               Throw New FormatException( _
                         String.Format("The '{0}' format specifier is not supported.", fmt))
         End Select                                                     
      End If   
   End Function
End Class
' The example displays the following output:
'       7-92031-59
'       7-92031-59
'       7/92031/59
'       7.92031.59
'       The 'X' format specifier is not supported.

Пример: поставщик перехвата и модуль форматирования чисел Roman

В этом примере определяется поставщик пользовательского формата, который реализует ICustomFormatter интерфейсы и, IFormatProvider чтобы выполнить два действия:

  • Он отображает параметры, передаваемые в его ICustomFormatter.Format реализацию. Это позволяет увидеть, какие параметры Format(IFormatProvider, String, Object[]) передаются методу в реализацию пользовательского форматирования для каждого объекта, который он пытается отформатировать. Это может быть полезно при отладке приложения.

  • Если форматируемый объект является значением байта без знака, которое форматируется с помощью строки стандартного формата "R", то пользовательское средство форматирования форматирует числовое значение как римские цифры.

using namespace System;
using namespace System::Globalization;

ref class InterceptProvider : IFormatProvider, ICustomFormatter
{
public:
   virtual Object^ GetFormat(Type^ formatType)
   {
      if (formatType == ICustomFormatter::typeid)   
         return this;
      else
         return nullptr;
   }
   
   virtual String^ Format(String^ format, Object^ obj, IFormatProvider^ provider) 
   {
      // Display information about method call.
      String^ formatString = format != nullptr ? format : "<null>";
      Console::WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider, obj != nullptr ? obj : "<null>", formatString);
                        
      if (obj == nullptr) return String::Empty;
            
      // If this is a byte and the "R" format string, format it with Roman numerals.
      if (obj->GetType() == Byte::typeid && formatString->ToUpper()->Equals("R")) {
         Byte value = (Byte) obj;
         int remainder;
         int result;
         String^ returnString = String::Empty;

         // Get the hundreds digit(s)
         result = Math::DivRem(value, 100, remainder);
         if (result > 0)  
            returnString = gcnew String('C', result);
         value = (Byte) remainder;
         // Get the 50s digit
         result = Math::DivRem(value, 50, remainder);
         if (result == 1)
            returnString += "L";
         value = (Byte) remainder;
         // Get the tens digit.
         result = Math::DivRem(value, 10, remainder);
         if (result > 0)
            returnString += gcnew String('X', result);
         value = (Byte) remainder; 
         // Get the fives digit.
         result = Math::DivRem(value, 5, remainder);
         if (result > 0)
            returnString += "V";
         value = (Byte) remainder;
         // Add the ones digit.
         if (remainder > 0) 
            returnString += gcnew String('I', remainder);
         
         // Check whether we have too many X characters.
         int pos = returnString->IndexOf("XXXX");
         if (pos >= 0) {
            int xPos = returnString->IndexOf("L"); 
            if ((xPos >= 0) & (xPos == pos - 1))
               returnString = returnString->Replace("LXXXX", "XC");
            else
               returnString = returnString->Replace("XXXX", "XL");   
         }
         // Check whether we have too many I characters
         pos = returnString->IndexOf("IIII");
         if (pos >= 0)
            if (returnString->IndexOf("V") >= 0)
               returnString = returnString->Replace("VIIII", "IX");
            else
               returnString = returnString->Replace("IIII", "IV");    

         return returnString; 
      }   

      // Use default for all other formatting.
      if (obj->GetType() == IFormattable::typeid)
         return ((IFormattable^) obj)->ToString(format, CultureInfo::CurrentCulture);
      else
         return obj->ToString();
   }
};

void main()
{
   int n = 10;
   double value = 16.935;
   DateTime day = DateTime::Now;
   InterceptProvider^ provider = gcnew InterceptProvider();
   Console::WriteLine(String::Format(provider, "{0:N0}: {1:C2} on {2:d}\n", n, value, day));
   Console::WriteLine(String::Format(provider, "{0}: {1:F}\n", "Today: ", 
                                    (DayOfWeek) DateTime::Now.DayOfWeek));
   Console::WriteLine(String::Format(provider, "{0:X}, {1}, {2}\n", 
                                    (Byte) 2, (Byte) 12, (Byte) 199));
   Console::WriteLine(String::Format(provider, "{0:R}, {1:R}, {2:R}\n", 
                                    (Byte) 2, (Byte) 12, (Byte) 199));
}
// The example displays the following output:
//    Provider: InterceptProvider, Object: 10, Format String: N0
//    Provider: InterceptProvider, Object: 16.935, Format String: C2
//    Provider: InterceptProvider, Object: 1/31/2013 6:10:28 PM, Format String: d
//    10: $16.94 on 1/31/2013
//    
//    Provider: InterceptProvider, Object: Today: , Format String: <null>
//    Provider: InterceptProvider, Object: Thursday, Format String: F
//    Today: : Thursday
//    
//    Provider: InterceptProvider, Object: 2, Format String: X
//    Provider: InterceptProvider, Object: 12, Format String: <null>
//    Provider: InterceptProvider, Object: 199, Format String: <null>
//    2, 12, 199
//    
//    Provider: InterceptProvider, Object: 2, Format String: R
//    Provider: InterceptProvider, Object: 12, Format String: R
//    Provider: InterceptProvider, Object: 199, Format String: R
//    II, XII, CXCIX
using System;
using System.Globalization;

public class InterceptProvider : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(ICustomFormatter))
         return this;
      else
         return null;
   }
   
   public string Format(String format, Object obj, IFormatProvider provider) 
   {
      // Display information about method call.
      string formatString = format ?? "<null>";
      Console.WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider.GetType().Name, obj ?? "<null>", formatString);
                        
      if (obj == null) return String.Empty;
            
      // If this is a byte and the "R" format string, format it with Roman numerals.
      if (obj is Byte && formatString.ToUpper().Equals("R")) {
         Byte value = (Byte) obj;
         int remainder;
         int result;
         String returnString = String.Empty;

         // Get the hundreds digit(s)
         result = Math.DivRem(value, 100, out remainder);
         if (result > 0)  
            returnString = new String('C', result);
         value = (Byte) remainder;
         // Get the 50s digit
         result = Math.DivRem(value, 50, out remainder);
         if (result == 1)
            returnString += "L";
         value = (Byte) remainder;
         // Get the tens digit.
         result = Math.DivRem(value, 10, out remainder);
         if (result > 0)
            returnString += new String('X', result);
         value = (Byte) remainder; 
         // Get the fives digit.
         result = Math.DivRem(value, 5, out remainder);
         if (result > 0)
            returnString += "V";
         value = (Byte) remainder;
         // Add the ones digit.
         if (remainder > 0) 
            returnString += new String('I', remainder);
         
         // Check whether we have too many X characters.
         int pos = returnString.IndexOf("XXXX");
         if (pos >= 0) {
            int xPos = returnString.IndexOf("L"); 
            if (xPos >= 0 & xPos == pos - 1)
               returnString = returnString.Replace("LXXXX", "XC");
            else
               returnString = returnString.Replace("XXXX", "XL");   
         }
         // Check whether we have too many I characters
         pos = returnString.IndexOf("IIII");
         if (pos >= 0)
            if (returnString.IndexOf("V") >= 0)
               returnString = returnString.Replace("VIIII", "IX");
            else
               returnString = returnString.Replace("IIII", "IV");    

         return returnString; 
      }   

      // Use default for all other formatting.
      if (obj is IFormattable)
         return ((IFormattable) obj).ToString(format, CultureInfo.CurrentCulture);
      else
         return obj.ToString();
   }
}

public class Example
{
   public static void Main()
   {
      int n = 10;
      double value = 16.935;
      DateTime day = DateTime.Now;
      InterceptProvider provider = new InterceptProvider();
      Console.WriteLine(String.Format(provider, "{0:N0}: {1:C2} on {2:d}\n", n, value, day));
      Console.WriteLine(String.Format(provider, "{0}: {1:F}\n", "Today: ", 
                                      (DayOfWeek) DateTime.Now.DayOfWeek));
      Console.WriteLine(String.Format(provider, "{0:X}, {1}, {2}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
      Console.WriteLine(String.Format(provider, "{0:R}, {1:R}, {2:R}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
   }
}
// The example displays the following output:
//    Provider: InterceptProvider, Object: 10, Format String: N0
//    Provider: InterceptProvider, Object: 16.935, Format String: C2
//    Provider: InterceptProvider, Object: 1/31/2013 6:10:28 PM, Format String: d
//    10: $16.94 on 1/31/2013
//    
//    Provider: InterceptProvider, Object: Today: , Format String: <null>
//    Provider: InterceptProvider, Object: Thursday, Format String: F
//    Today: : Thursday
//    
//    Provider: InterceptProvider, Object: 2, Format String: X
//    Provider: InterceptProvider, Object: 12, Format String: <null>
//    Provider: InterceptProvider, Object: 199, Format String: <null>
//    2, 12, 199
//    
//    Provider: InterceptProvider, Object: 2, Format String: R
//    Provider: InterceptProvider, Object: 12, Format String: R
//    Provider: InterceptProvider, Object: 199, Format String: R
//    II, XII, CXCIX
Imports System.Globalization

Public Class InterceptProvider : Implements IFormatProvider, ICustomFormatter
   Public Function GetFormat(formatType As Type) As Object _
         Implements IFormatProvider.GetFormat
      If formatType Is GetType(ICustomFormatter) Then
         Return Me
      Else
         Return Nothing
      End If
   End Function
   
   Public Function Format(fmt As String, obj As Object, provider As IFormatProvider) As String _
         Implements ICustomFormatter.Format

      Dim formatString As String = If(fmt IsNot Nothing, fmt, "<null>")
      Console.WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider, If(obj IsNot Nothing, obj, "<null>"), formatString)

      If obj Is Nothing Then Return String.Empty
            
      ' If this is a byte and the "R" format string, format it with Roman numerals.
      If TypeOf(obj) Is Byte AndAlso formatString.ToUpper.Equals("R") Then
         Dim value As Byte = CByte(obj)
         Dim remainder As Integer
         Dim result As Integer
         Dim returnString As String = String.Empty

         ' Get the hundreds digit(s)
         result = Math.DivRem(value, 100, remainder)
         If result > 0 Then returnString = New String("C"c, result)
         value = CByte(remainder)
         ' Get the 50s digit
         result = Math.DivRem(value, 50, remainder)
         If result = 1 Then returnString += "L"
         value = CByte(remainder)
         ' Get the tens digit.
         result = Math.DivRem(value, 10, remainder)
         If result > 0 Then returnString += New String("X"c, result)
         value = CByte(remainder) 
         ' Get the fives digit.
         result = Math.DivRem(value, 5, remainder)
         If result > 0 Then returnString += "V"
         value = CByte(remainder)
         ' Add the ones digit.
         If remainder > 0 Then returnString += New String("I"c, remainder)
         
         ' Check whether we have too many X characters.
         Dim pos As Integer = returnString.IndexOf("XXXX")
         If pos >= 0 Then
            Dim xPos As Integer = returnString.IndexOf("L") 
            If xPos >= 0 And xPos = pos - 1 Then
               returnString = returnString.Replace("LXXXX", "XC")
            Else
               returnString = returnString.Replace("XXXX", "XL")   
            End If         
         End If
         ' Check whether we have too many I characters
         pos = returnString.IndexOf("IIII")
         If pos >= 0 Then
            If returnString.IndexOf("V") >= 0 Then
               returnString = returnString.Replace("VIIII", "IX")
            Else
               returnString = returnString.Replace("IIII", "IV")    
            End If
         End If
         Return returnString 
      End If   

      ' Use default for all other formatting.
      If obj Is GetType(IFormattable)
         Return CType(obj, IFormattable).ToString(fmt, CultureInfo.CurrentCulture)
      Else
         Return obj.ToString()
      End If
   End Function
End Class

Module Example
   Public Sub Main()
      Dim n As Integer = 10
      Dim value As Double = 16.935
      Dim day As DateTime = Date.Now
      Dim provider As New InterceptProvider()
      Console.WriteLine(String.Format(provider, "{0:N0}: {1:C2} on {2:d}", n, value, day))
      Console.WriteLine()
      Console.WriteLine(String.Format(provider, "{0}: {1:F}", "Today", 
                                      CType(Date.Now.DayOfWeek, DayOfWeek)))
      Console.WriteLine()
      Console.WriteLine(String.Format(provider, "{0:X}, {1}, {2}\n", 
                                      CByte(2), CByte(12), CByte(199)))
      Console.WriteLine()
      Console.WriteLine(String.Format(provider, "{0:R}, {1:R}, {2:R}", 
                                      CByte(2), CByte(12), CByte(199)))
   End Sub
End Module
' The example displays the following output:
'    Provider: InterceptProvider, Object: 10, Format String: N0
'    Provider: InterceptProvider, Object: 16.935, Format String: C2
'    Provider: InterceptProvider, Object: 1/31/2013 6:10:28 PM, Format String: d
'    10: $16.94 on 1/31/2013
'    
'    Provider: InterceptProvider, Object: Today: , Format String: <null>
'    Provider: InterceptProvider, Object: Thursday, Format String: F
'    Today: : Thursday
'    
'    Provider: InterceptProvider, Object: 2, Format String: X
'    Provider: InterceptProvider, Object: 12, Format String: <null>
'    Provider: InterceptProvider, Object: 199, Format String: <null>
'    2, 12, 199
'    
'    Provider: InterceptProvider, Object: 2, Format String: R
'    Provider: InterceptProvider, Object: 12, Format String: R
'    Provider: InterceptProvider, Object: 199, Format String: R
'    II, XII, CXCIX

Строка. формат Q & A

Почему рекомендуется использовать интерполяцию строк вместо вызовов String.Format метода?

Интерполяция строк:

  • Более гибкий. Его можно использовать в любой строке, не требуя вызова метода, поддерживающего составное форматирование. В противном случае необходимо вызвать Format метод или другой метод, поддерживающий составное форматирование, например Console.WriteLine или StringBuilder.AppendFormat .

  • Более удобочитаемый. Так как выражение, вставляемое в строку, появляется в выражении с интерполяцией, а не в списке аргументов, интерполяция строк намного проще в коде и чтении. Из-за большей удобочитаемости интерполяция строк может заменить не только вызовы методов составного формата, но и их также можно использовать в операциях объединения строк для создания более краткого, более понятного кода.

Сравнение следующих двух примеров кода иллюстрирует наилучшее значение интерполяции строк по объединению строк и вызовам методов составного форматирования. Использование нескольких операций сцепления строк в следующем примере создает подробный и трудный для чтения код.

  string[] names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" };
  string output = names[0] + ", " + names[1] + ", " + names[2] + ", " + 
                  names[3] + ", " + names[4] + ", " + names[5] + ", " + 
                  names[6];  

  output += "\n";  
  var date = DateTime.Now;
  output += String.Format("It is {0:t} on {0:d}. The day of the week is {1}.", 
                          date, date.DayOfWeek);
  Console.WriteLine(output);                           
  // The example displays the following output:
  //     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
  //     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

Module Example
   Public Sub Main()
      Dim names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" }
      Dim output = names(0) + ", " + names(1) + ", " + names(2) + ", " + 
                   names(3) + ", " + names(4) + ", " + names(5) + ", " + 
                   names(6)  
    
      output += vbCrLf  
      Dim dat = DateTime.Now
      output += String.Format("It is {0:t} on {0:d}. The day of the week is {1}.", 
                              dat, dat.DayOfWeek)
      Console.WriteLine(output)                           
   End Sub
End Module
' The example displays the following output:
'     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
'     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

В отличие от этого, использование интерполяции строк в следующем примере создает гораздо более четкий, более краткий код, чем оператор объединения строк и вызов Format метода из предыдущего примера.

  string[] names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" };
  string output = $"{names[0]}, {names[1]}, {names[2]}, {names[3]}, {names[4]}, " + 
                  $"{names[5]}, {names[6]}";  

  var date = DateTime.Now;
  output += $"\nIt is {date:t} on {date:d}. The day of the week is {date.DayOfWeek}.";
  Console.WriteLine(output);                           
  // The example displays the following output:
  //     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
  //     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

Module Example
   Public Sub Main()
      Dim names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" }
      Dim output = $"{names(0)}, {names(1)}, {names(2)}, {names(3)}, {names(4)}, " + 
                   $"{names(5)}, {names(6)}"  
    
      Dim dat = DateTime.Now
      output += $"{vbCrLf}It is {dat:t} on {dat:d}. The day of the week is {dat.DayOfWeek}." 
      Console.WriteLine(output)                           
   End Sub
End Module
' The example displays the following output:
'     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
'     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

Где можно найти список стандартных строк формата, которые можно использовать с элементами форматирования?

Разделы справки управлять выравниванием результирующих строк, которые заменяют элементы форматирования?

Общий синтаксис элемента форматирования:

{index[,alignment][: formatString]}

где alignment — это целое число со знаком, определяющее ширину поля. Если это значение отрицательное, текст в поле выполнится по левому краю. Если он положительный, текст выровняйтеся по правому краю.

Разделы справки контролировать количество цифр после десятичного разделителя?

Все строки стандартных числовых форматов , за исключением "D" (которая используется только с целыми числами), "G", "R" и "X", допускают описатель точности, определяющий число десятичных цифр в результирующей строке. В следующем примере используются строки стандартного числового формата для управления количеством десятичных цифр в результирующей строке.

object[] values = { 1603, 1794.68235, 15436.14 };
string result;
foreach (var value in values) {
   result = String.Format("{0,12:C2}   {0,12:E3}   {0,12:F4}   {0,12:N3}  {1,12:P2}\n",
                          Convert.ToDouble(value), Convert.ToDouble(value) / 10000);
   Console.WriteLine(result);
}                           
// The example displays output like the following:
//       $1,603.00     1.603E+003      1603.0000      1,603.000       16.03 %
//    
//       $1,794.68     1.795E+003      1794.6824      1,794.682       17.95 %
//    
//      $15,436.14     1.544E+004     15436.1400     15,436.140      154.36 %
Module Example
   Public Sub Main()
      Dim values() As Object = { 1603, 1794.68235, 15436.14 }
      Dim result As String
      For Each value In values
         result = String.Format("{0,12:C2}   {0,12:E3}   {0,12:F4}   {0,12:N3}  {1,12:P2}",
                                value, CDbl(value) / 10000)
         Console.WriteLine(result) 
         Console.WriteLine()
      Next                             
   End Sub
End Module
' The example displays the following output:
'       $1,603.00     1.603E+003      1603.0000      1,603.000       16.03 %
'    
'       $1,794.68     1.795E+003      1794.6824      1,794.682       17.95 %
'    
'      $15,436.14     1.544E+004     15436.1400     15,436.140      154.36 %

Если вы используете строку настраиваемого числового формата, используйте описатель формата "0" для управления числом десятичных цифр в результирующей строке, как показано в следующем примере.

decimal value = 16309.5436m;
string result = String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}", 
                              value);
Console.WriteLine(result);
// The example displays the following output:
//        16309.54360    16,309.54    16309.544
Module Example
   Public Sub Main()
      Dim value As Decimal = 16309.5436d
      Dim result As String = String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}", 
                                           value)
      Console.WriteLine(result)
   End Sub
End Module
' The example displays the following output:
'    16309.54360    16,309.54    16309.544

Разделы справки контролировать количество цифр целой части?

По умолчанию операции форматирования отображают только ненулевые цифры целой части. При форматировании целых чисел можно использовать описатель точности с строками стандартного формата "D" и "X" для управления количеством цифр.

int value = 1326;
string result = String.Format("{0,10:D6} {0,10:X8}", value);
Console.WriteLine(result);
// The example displays the following output:
//     001326   0000052E
Module Example
   Public Sub Main()
      Dim value As Integer = 1326
      Dim result As String = String.Format("{0,10:D6} {0,10:X8}", value)
      Console.WriteLine(result)
   End Sub
End Module
' The example displays the following output:
'       001326   0000052E

Чтобы получить результирующую строку с указанным числом целых чисел с помощью настраиваемого описателя числового формата"0", можно указать целое число или количество с плавающей запятой с нулем в начале, как показано в следующем примере.

int value = 16342;
string result = String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}", 
                              value);
Console.WriteLine(result);
// The example displays the following output:
//           00016342       00016342.000    0,000,016,342.0
Module Example
   Public Sub Main()
      Dim value As Integer = 16342
      Dim result As String = String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}", 
                                           value)
      Console.WriteLine(result)
   End Sub
End Module
' The example displays the following output:
'           00016342       00016342.000    0,000,016,342.0

Сколько элементов можно включить в список форматов?

Практические ограничения отсутствуют. Второй параметр Format(IFormatProvider, String, Object[]) метода помечен ParamArrayAttribute атрибутом, который позволяет включить в список форматов список с разделителями или массив объектов.

Разделы справки содержать литеральные скобки ("{" и "}") в результирующей строке?

Например, как предотвратить возникновение исключения следующим вызовом метода FormatException ?

result = String.Format("The text has {0} '{' characters and {1} '}' characters.",
                       nOpen, nClose);
result = String.Format("The text has {0} '{' characters and {1} '}' characters.",
                       nOpen, nClose)

Одиночная открывающая или закрывающая фигурная скобка всегда интерпретируется как начало или конец элемента форматирования. Чтобы интерпретировать его буквально, его необходимо экранировать. Фигурную скобку можно отключать, добавив еще одну фигурную скобку ("{{" и "}}") вместо "{" и "}"), как показано в следующем вызове метода:

string result;
int nOpen = 1;
int nClose = 2;
result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
                       nOpen, nClose);
Console.WriteLine(result);
result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
                       nOpen, nClose)

Однако даже экранированные фигурные скобки легко интерпретировать. Рекомендуется включать фигурные скобки в список форматов и использовать элементы форматирования для вставки их в результирующую строку, как показано в следующем примере.

string result;
int nOpen = 1;
int nClose = 2;
result = String.Format("The text has {0} '{1}' characters and {2} '{3}' characters.",
                       nOpen, "{", nClose, "}");
Console.WriteLine(result);
result = String.Format("The text has {0} '{1}' characters and {2} '{3}' characters.",
                       nOpen, "{", nClose, "}")

Почему вызов метода String. Format вызывает исключение FormatException?

Наиболее распространенной причиной возникновения исключения является то, что индекс элемента форматирования не соответствует объекту в списке Format. Обычно это означает, что вы ввели ненумерованные индексы элементов форматирования или забыли включить объект в список форматов. При попытке включить символ левой или правой фигурной скобки в кавычки также возникает исключение FormatException . Иногда исключение является результатом опечатки; Например, типичная ошибка заключается в ошибочном вводе "[" (левой скобки) вместо "{" (открывающей фигурной скобки).

Если метод Format (System. IFormatProvider, System. String, System. Object []) поддерживает массивы параметров, почему мой код создает исключение при использовании массива?

Например, следующий код вызывает FormatException исключение:

Random rnd = new Random();
int[]  numbers = new int[4];
int total = 0;
for (int ctr = 0; ctr <= 2; ctr++) {
   int number = rnd.Next(1001);
   numbers[ctr] = number;
   total += number;
}   
numbers[3] = total;
Console.WriteLine("{0} + {1} + {2} = {3}", numbers);
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim rnd As New Random()
      Dim numbers(3) As Integer
      Dim total As Integer = 0
      For ctr = 0 To 2
         Dim number As Integer = rnd.Next(1001)
         numbers(ctr) = number
         total += number
      Next
      numbers(3) = total
      Console.WriteLine("{0} + {1} + {2} = {3}", numbers)   
   End Sub
End Module

Это проблема разрешения перегрузки компилятора. Поскольку компилятор не может преобразовать массив целых чисел в массив объектов, он обрабатывает целочисленный массив как один аргумент, поэтому он вызывает Format(String, Object) метод. Исключение возникает из-за четырех элементов форматирования, но только одного элемента в списке Format.

поскольку ни Visual Basic, ни C# не могут преобразовать массив целых чисел в массив объектов, необходимо выполнить преобразование самостоятельно перед вызовом Format(String, Object[]) метода. В следующем примере показано, как это делается.

Random rnd = new Random();
int[]  numbers = new int[4];
int total = 0;
for (int ctr = 0; ctr <= 2; ctr++) {
   int number = rnd.Next(1001);
   numbers[ctr] = number;
   total += number;
}   
numbers[3] = total;
object[] values = new object[numbers.Length];
numbers.CopyTo(values, 0);
Console.WriteLine("{0} + {1} + {2} = {3}", values);
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim rnd As New Random()
      Dim numbers(3) As Integer
      Dim total As Integer = 0
      For ctr = 0 To 2
         Dim number As Integer = rnd.Next(1001)
         numbers(ctr) = number
         total += number
      Next
      numbers(3) = total
      Dim values(numbers.Length - 1) As Object
      numbers.CopyTo(values, 0) 
      Console.WriteLine("{0} + {1} + {2} = {3}", values)   
   End Sub
End Module

Format(String, Object)

Заменяет один или более элементов формата в строке строковым представлением указанного объекта.

public:
 static System::String ^ Format(System::String ^ format, System::Object ^ arg0);
public static string Format (string format, object arg0);
public static string Format (string format, object? arg0);
static member Format : string * obj -> string
Public Shared Function Format (format As String, arg0 As Object) As String

Параметры

arg0
Object

Объект для форматирования.

Возвращаемое значение

String

Копия format, в которой все элементы формата заменены строковыми представлениями arg0.

Исключения

format имеет значение null.

Недопустимый элемент формата в format.

-или-

Индекс элемента формата не равен нулю.

Комментарии

Важно!

Вместо вызова метода String.Format или использования строк составного формата можно использовать интерполированные строки, если ваш язык их поддерживает. Интерполированная строка — это строка, которая содержит интерполированные выражения. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).

Этот метод использует функцию составного форматирования для преобразования значения выражения в строковое представление и встраивания этого представления в строку.

Тем не менее при вызове метода String.Format необязательно учитывать конкретную перегрузку, которую требуется вызвать. Вместо этого можно вызвать метод с составной строкой формата, которая включает один или несколько элементов формата. Каждому элементу формата назначается числовой индекс, начиная с 0. Помимо исходной строки вызов метода должен содержать дополнительные аргументы, число которых соответствует количеству значений индекса. Например, строка, элементы формата которой имеют индексы 0 и 1, должна иметь 2 аргумента. Для строки с индексами от 0 до 5 потребуется 6 аргументов. После этого компилятор языка будет разрешать вызов метода в конкретную перегрузку метода String.Format.

Дополнительные сведения об использовании метода String.Format см. в статьях Начало работы с методом String.Format и Выбор вызываемого метода.

Пример. форматирование одного аргумента

В следующем примере метод используется Format(String, Object) для встраивания возраста человека в середину строки.

using namespace System;

void main()
{
   DateTime birthdate = DateTime(1993, 7, 28);
   array<DateTime>^ dates = gcnew array<DateTime> { DateTime(1993, 8, 16), 
                                                    DateTime(1994, 7, 28), 
                                                    DateTime(2000, 10, 16), 
                                                    DateTime(2003, 7, 27), 
                                                    DateTime(2007, 5, 27) };

   for each (DateTime dateValue in dates)
   {
      TimeSpan interval = dateValue - birthdate;
      // Get the approximate number of years, without accounting for leap years.
      int years = ((int)interval.TotalDays) / 365;
      // See if adding the number of years exceeds dateValue.
      String^ output;
      if (birthdate.AddYears(years) <= dateValue) {
         output = String::Format("You are now {0} years old.", years);
         Console::WriteLine(output);
      }   
      else {
         output = String::Format("You are now {0} years old.", years - 1);
         Console::WriteLine(output);
      }      
   }
}
// The example displays the following output:
//       You are now 0 years old.
//       You are now 1 years old.
//       You are now 7 years old.
//       You are now 9 years old.
//       You are now 13 years old.
DateTime birthdate = new DateTime(1993, 7, 28);
DateTime[] dates = { new DateTime(1993, 8, 16), 
                     new DateTime(1994, 7, 28), 
                     new DateTime(2000, 10, 16), 
                     new DateTime(2003, 7, 27), 
                     new DateTime(2007, 5, 27) };

foreach (DateTime dateValue in dates)
{
   TimeSpan interval = dateValue - birthdate;
   // Get the approximate number of years, without accounting for leap years.
   int years = ((int) interval.TotalDays) / 365;
   // See if adding the number of years exceeds dateValue.
   string output;
   if (birthdate.AddYears(years) <= dateValue) {
      output = String.Format("You are now {0} years old.", years);
      Console.WriteLine(output);
   }   
   else {
      output = String.Format("You are now {0} years old.", years - 1);
      Console.WriteLine(output);
   }      
}
// The example displays the following output:
//       You are now 0 years old.
//       You are now 1 years old.
//       You are now 7 years old.
//       You are now 9 years old.
//       You are now 13 years old.
Module Example
   Public Sub Main()
      Dim birthdate As Date = #7/28/1993#
      Dim dates() As Date = { #9/16/1993#, #7/28/1994#, #10/16/2000#, _
                              #7/27/2003#, #5/27/2007# }
      For Each dateValue As Date In dates
         Dim interval As TimeSpan = dateValue - birthdate
         ' Get the approximate number of years, without accounting for leap years.
         Dim years As Integer = CInt(interval.TotalDays) \ 365
         ' See if adding the number of years exceeds dateValue.
         Dim output As String
         If birthdate.AddYears(years) <= dateValue Then
            output = String.Format("You are now {0} years old.", years)
            Console.WriteLine(output)
         Else
            output = String.Format("You are now {0} years old.", years - 1)
            Console.WriteLine(output)   
         End If
      Next
   End Sub
End Module
' The example displays the following output:
'       You are now 0 years old.
'       You are now 1 years old.
'       You are now 7 years old.
'       You are now 9 years old.
'       You are now 13 years old.

См. также раздел

Применяется к

Format(String, Object[])

Заменяет элемент формата в указанной строке строковым представлением соответствующего объекта в указанном массиве.

public:
 static System::String ^ Format(System::String ^ format, ... cli::array <System::Object ^> ^ args);
public static string Format (string format, params object[] args);
public static string Format (string format, params object?[] args);
static member Format : string * obj[] -> string
Public Shared Function Format (format As String, ParamArray args As Object()) As String

Параметры

args
Object[]

Массив объектов, содержащий нуль или более форматируемых объектов.

Возвращаемое значение

String

Копия format, в которой элементы формата заменены строковыми представления соответствующих объектов в args.

Исключения

Параметр format или args имеет значение null.

format недопустим.

-или-

Индекс элемента формата меньше нуля или больше либо равен длине массива args.

Комментарии

Важно!

Вместо вызова метода String.Format или использования строк составного формата можно использовать интерполированные строки, если ваш язык их поддерживает. Интерполированная строка — это строка, которая содержит интерполированные выражения. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).

Этот метод использует функцию составного форматирования для преобразования значения четырех или более выражений в их строковые представления и встраивания этих представлений в строку. Так как args параметр помечен System.ParamArrayAttribute атрибутом, можно передать объекты в метод как отдельные аргументы или как Object массив.

Тем не менее при вызове метода String.Format необязательно учитывать конкретную перегрузку, которую требуется вызвать. Вместо этого можно вызвать метод с составной строкой формата, которая включает один или несколько элементов формата. Каждому элементу формата назначается числовой индекс, начиная с 0. Помимо исходной строки вызов метода должен содержать дополнительные аргументы, число которых соответствует количеству значений индекса. Например, строка, элементы формата которой имеют индексы 0 и 1, должна иметь 2 аргумента. Для строки с индексами от 0 до 5 потребуется 6 аргументов. После этого компилятор языка будет разрешать вызов метода в конкретную перегрузку метода String.Format.

Дополнительные сведения об использовании метода String.Format см. в статьях Начало работы с методом String.Format и Выбор вызываемого метода.

Пример. форматирование более трех аргументов

В этом примере создается строка, которая содержит данные о высокой и низкой температуре в определенной дате. строка составного формата содержит пять элементов формата в примере C# и шесть в Visual Basic примере. Два элемента форматирования определяют ширину строкового представления соответствующего значения, а первый элемент форматирования также включает строку стандартного формата даты и времени.

using namespace System;

void main()
{
   DateTime date1 = DateTime(2009, 7, 1);
   TimeSpan hiTime = TimeSpan(14, 17, 32);
   Decimal hiTemp = (Decimal) 62.1; 
   TimeSpan loTime = TimeSpan(3, 16, 10);
   Decimal loTemp = (Decimal)54.8; 

   String^ result1 = String::Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                    date1, hiTime, hiTemp, loTime, loTemp);
   Console::WriteLine(result1);
   Console::WriteLine();
           
   String^ result2 = String::Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                    gcnew array<Object^> { date1, hiTime, hiTemp, loTime, loTemp });
   Console::WriteLine(result2);
}
// The example displays the following output:
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
DateTime date1 = new DateTime(2009, 7, 1);
TimeSpan hiTime = new TimeSpan(14, 17, 32);
decimal hiTemp = 62.1m; 
TimeSpan loTime = new TimeSpan(3, 16, 10);
decimal loTemp = 54.8m; 

string result1 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                               date1, hiTime, hiTemp, loTime, loTemp);
Console.WriteLine(result1);
Console.WriteLine();
     
string result2 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                               new object[] { date1, hiTime, hiTemp, loTime, loTemp });
Console.WriteLine(result2);
// The example displays output like the following:
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
Module Example
   Public Sub Main()
      Dim date1 As Date = #7/1/2009#
      Dim hiTime As New TimeSpan(14, 17, 32)
      Dim hiTemp As Decimal = 62.1d 
      Dim loTime As New TimeSpan(3, 16, 10)
      Dim loTemp As Decimal = 54.8d 

      Dim result1 As String = String.Format("Temperature on {0:d}:{5}{1,11}: {2} degrees (hi){5}{3,11}: {4} degrees (lo)", _
                                           date1, hiTime, hiTemp, loTime, loTemp, vbCrLf)
      Console.WriteLine(result1)
      Console.WriteLine()
           
      Dim result2 As String = String.Format("Temperature on {0:d}:{5}{1,11}: {2} degrees (hi){5}{3,11}: {4} degrees (lo)", _
                                            New Object() { date1, hiTime, hiTemp, loTime, loTemp, vbCrLf })
      Console.WriteLine(result2)                                            
   End Sub
End Module
' The example displays the following output:
'       Temperature on 7/1/2009:
'          14:17:32: 62.1 degrees (hi)
'          03:16:10: 54.8 degrees (lo)
'
'       Temperature on 7/1/2009:
'          14:17:32: 62.1 degrees (hi)
'          03:16:10: 54.8 degrees (lo)

Также можно передать объекты в виде массива, а не в виде списка аргументов.

using namespace System;

ref class CityInfo
{
public:
   CityInfo(String^ name, int population, Decimal area, int year)
   {
      this->Name = name;
      this->Population = population;
      this->Area = area;
      this->Year = year;
   }
   
   String^ Name; 
   int Population;
   Decimal Area;
   int Year;
};

ref class Example
{
public:
   static void ShowPopulationData(CityInfo^ city)
   {
      array<Object^>^ args = gcnew array<Object^> { city->Name, city->Year, city->Population, city->Area };
      String^ result = String::Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", 
                                    args);
      Console::WriteLine(result); 
   }
};

void main()
{
   CityInfo^ nyc2010 = gcnew CityInfo("New York", 8175133, (Decimal) 302.64, 2010);
   Example::ShowPopulationData(nyc2010);
   CityInfo^ sea2010 = gcnew CityInfo("Seattle", 608660, (Decimal) 83.94, 2010);      
   Example::ShowPopulationData(sea2010); 
}
// The example displays the following output:
//       New York in 2010: Population 8,175,133, Area 302.6 sq. feet
//       Seattle in 2010: Population 608,660, Area 83.9 sq. feet
using System;

public class CityInfo
{
   public CityInfo(String name, int population, Decimal area, int year)
   {
      this.Name = name;
      this.Population = population;
      this.Area = area;
      this.Year = year;
   }
   
   public readonly String Name; 
   public readonly int Population;
   public readonly Decimal Area;
   public readonly int Year;
}

public class Example
{
   public static void Main()
   {
      CityInfo nyc2010 = new CityInfo("New York", 8175133, 302.64m, 2010);
      ShowPopulationData(nyc2010);
      CityInfo sea2010 = new CityInfo("Seattle", 608660, 83.94m, 2010);      
      ShowPopulationData(sea2010); 
   }

   private static void ShowPopulationData(CityInfo city)
   {
      object[] args = { city.Name, city.Year, city.Population, city.Area };
      String result = String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", 
                                    args);
      Console.WriteLine(result); 
   }
}
// The example displays the following output:
//       New York in 2010: Population 8,175,133, Area 302.6 sq. feet
//       Seattle in 2010: Population 608,660, Area 83.9 sq. feet
Public Class CityInfo
   Public Sub New(name As String, population As Integer, area As Decimal, year As Integer)
      Me.Name = name
      Me.Population = population
      Me.Area = area
      Me.Year = year
   End Sub
   
   Public ReadOnly Name As String
   Public ReadOnly Population As Integer
   Public ReadOnly Area As Decimal
   Public ReadOnly Year As Integer
End Class

Module Example
   Public Sub Main()
      Dim nyc2010 As New CityInfo("New York", 8175133, 302.64d, 2010)
      ShowPopulationData(nyc2010)
      Dim sea2010 As New CityInfo("Seattle", 608660, 83.94d, 2010)      
      ShowPopulationData(sea2010) 
   End Sub
   
   Private Sub ShowPopulationData(city As CityInfo)
      Dim args() As Object = { city.Name, city.Year, city.Population, city.Area }
      Dim result = String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", args)
      Console.WriteLine(result) 
   End Sub
End Module
' The example displays the following output:
'       New York in 2010: Population 8,175,133, Area 302.6 sq. feet
'       Seattle in 2010: Population 608,660, Area 83.9 sq. feet

См. также раздел

Применяется к

Format(IFormatProvider, String, Object)

Заменяет элементы формата в указанной строке строковым представлением соответствующего объекта. Параметр предоставляет сведения об особенностях форматирования, связанных с языком и региональными параметрами.

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, System::Object ^ arg0);
public static string Format (IFormatProvider provider, string format, object arg0);
public static string Format (IFormatProvider? provider, string format, object? arg0);
static member Format : IFormatProvider * string * obj -> string
Public Shared Function Format (provider As IFormatProvider, format As String, arg0 As Object) As String

Параметры

provider
IFormatProvider

Объект, предоставляющий сведения о форматировании для определенного языка и региональных параметров.

arg0
Object

Объект для форматирования.

Возвращаемое значение

String

Копия format, в которой элементы форматирования были заменены строковым представлением arg0.

Исключения

format имеет значение null.

format недопустим.

-или-

Индекс элемента формата не равен нулю.

Комментарии

Важно!

Вместо вызова метода String.Format или использования строк составного формата можно использовать интерполированные строки, если ваш язык их поддерживает. Интерполированная строка — это строка, которая содержит интерполированные выражения. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).

Этот метод использует функцию составного форматирования для преобразования значения выражения в строковое представление и встраивания этого представления в строку. При выполнении преобразования метод использует форматирование с учетом языка и региональных параметров или пользовательский модуль форматирования. Метод преобразует arg0 в свое строковое представление путем вызова его метода ToString (IFormatProvider) или, если соответствующий элемент форматирования объекта включает строку формата, вызывая метод ToString (String, IFormatProvider) . Если эти методы не существуют, вызывается метод ToString без параметров объекта.

Тем не менее при вызове метода String.Format необязательно учитывать конкретную перегрузку, которую требуется вызвать. Вместо этого можно вызвать этот метод с использованием объекта, который предоставляет зависящее от языка и региональных параметров или настраиваемое форматирование, а также составной строки формата, которая включает один или несколько элементов формата. Каждому элементу формата назначается числовой индекс, начиная с 0. Помимо исходной строки вызов метода должен содержать дополнительные аргументы, число которых соответствует количеству значений индекса. Например, строка, элементы формата которой имеют индексы 0 и 1, должна иметь 2 аргумента. Для строки с индексами от 0 до 5 потребуется 6 аргументов. После этого компилятор языка будет разрешать вызов метода в конкретную перегрузку метода String.Format.

Дополнительные сведения об использовании метода String.Format см. в статьях Начало работы с методом String.Format и Выбор вызываемого метода.

Применяется к

Format(IFormatProvider, String, Object[])

Заменяет элементы формата в строке строковым представлениями соответствующих объектов в указанном массиве. Параметр предоставляет сведения об особенностях форматирования, связанных с языком и региональными параметрами.

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, ... cli::array <System::Object ^> ^ args);
public static string Format (IFormatProvider provider, string format, params object[] args);
public static string Format (IFormatProvider? provider, string format, params object?[] args);
static member Format : IFormatProvider * string * obj[] -> string
Public Shared Function Format (provider As IFormatProvider, format As String, ParamArray args As Object()) As String

Параметры

provider
IFormatProvider

Объект, предоставляющий сведения о форматировании для определенного языка и региональных параметров.

args
Object[]

Массив объектов, содержащий нуль или более форматируемых объектов.

Возвращаемое значение

String

Копия format, в которой элементы формата заменены строковыми представления соответствующих объектов в args.

Исключения

Параметр format или args имеет значение null.

format недопустим.

-или-

Индекс элемента формата меньше нуля или больше либо равен длине массива args.

Комментарии

Важно!

Вместо вызова метода String.Format или использования строк составного формата можно использовать интерполированные строки, если ваш язык их поддерживает. Интерполированная строка — это строка, которая содержит интерполированные выражения. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).

Этот метод использует функцию составного форматирования для преобразования четырех или более выражений в их строковые представления и для встраивания этих представлений в строку. При выполнении преобразования метод использует форматирование с учетом языка и региональных параметров или пользовательский модуль форматирования. Метод преобразует каждый Object аргумент в свое строковое представление путем вызова его метода ToString (IFormatProvider) или, если соответствующий элемент форматирования объекта включает строку формата, вызывая его метод ToString (String, IFormatProvider) . Если эти методы не существуют, вызывается метод ToString без параметров объекта.

Тем не менее при вызове метода String.Format необязательно учитывать конкретную перегрузку, которую требуется вызвать. Вместо этого можно вызвать этот метод с использованием объекта, который предоставляет зависящее от языка и региональных параметров или настраиваемое форматирование, а также составной строки формата, которая включает один или несколько элементов формата. Каждому элементу формата назначается числовой индекс, начиная с 0. Помимо исходной строки вызов метода должен содержать дополнительные аргументы, число которых соответствует количеству значений индекса. Например, строка, элементы формата которой имеют индексы 0 и 1, должна иметь 2 аргумента. Для строки с индексами от 0 до 5 потребуется 6 аргументов. После этого компилятор языка будет разрешать вызов метода в конкретную перегрузку метода String.Format.

Дополнительные сведения об использовании метода String.Format см. в статьях Начало работы с методом String.Format и Выбор вызываемого метода.

Пример: форматирование с учетом языка и региональных параметров

В этом примере используется Format(IFormatProvider, String, Object[]) метод для отображения строкового представления некоторых значений даты и времени и числовых значений с использованием нескольких различных языков и региональных параметров.

string[] cultureNames = { "en-US", "fr-FR", "de-DE", "es-ES" };

DateTime dateToDisplay = new DateTime(2009, 9, 1, 18, 32, 0);
double value = 9164.32;

Console.WriteLine("Culture     Date                                Value\n");
foreach (string cultureName in cultureNames)
{
   System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(cultureName);
   string output = String.Format(culture, "{0,-11} {1,-35:D} {2:N}", 
                                 culture.Name, dateToDisplay, value);
   Console.WriteLine(output);
}    
// The example displays the following output:
//    Culture     Date                                Value
//    
//    en-US       Tuesday, September 01, 2009         9,164.32
//    fr-FR       mardi 1 septembre 2009              9 164,32
//    de-DE       Dienstag, 1. September 2009         9.164,32
//    es-ES       martes, 01 de septiembre de 2009    9.164,32
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "de-DE", "es-ES" }
      
      Dim dateToDisplay As Date = #9/1/2009 6:32PM#
      Dim value As Double = 9164.32

      Console.WriteLine("Culture     Date                                Value")
      Console.WriteLine()      
      For Each cultureName As String In cultureNames
         Dim culture As New CultureInfo(cultureName)
         Dim output As String = String.Format(culture, "{0,-11} {1,-35:D} {2:N}", _
                                              culture.Name, dateToDisplay, value)
         Console.WriteLine(output)
      Next    
   End Sub
End Module
' The example displays the following output:
'       Culture     Date                                Value
'       
'       en-US       Tuesday, September 01, 2009         9,164.32
'       fr-FR       mardi 1 septembre 2009              9 164,32
'       de-DE       Dienstag, 1. September 2009         9.164,32
'       es-ES       martes, 01 de septiembre de 2009    9.164,32

См. также раздел

Применяется к

Format(String, Object, Object)

Заменяет элементы формата в строке строковым представлением двух указанных объектов.

public:
 static System::String ^ Format(System::String ^ format, System::Object ^ arg0, System::Object ^ arg1);
public static string Format (string format, object arg0, object arg1);
public static string Format (string format, object? arg0, object? arg1);
static member Format : string * obj * obj -> string
Public Shared Function Format (format As String, arg0 As Object, arg1 As Object) As String

Параметры

arg0
Object

Первый объект для форматирования.

arg1
Object

Второй объект для форматирования.

Возвращаемое значение

String

Копия format, в которой все элементы формата заменены строковыми представлениями arg0 и arg1.

Исключения

format имеет значение null.

format недопустим.

-или-

Индекс элемента формата не равен нулю или единице.

Комментарии

Важно!

Вместо вызова метода String.Format или использования строк составного формата можно использовать интерполированные строки, если ваш язык их поддерживает. Интерполированная строка — это строка, которая содержит интерполированные выражения. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).

Этот метод использует функцию составного форматирования для преобразования значений двух выражений в их строковые представления и встраивания этих представлений в строку.

Тем не менее при вызове метода String.Format необязательно учитывать конкретную перегрузку, которую требуется вызвать. Вместо этого можно вызвать метод с составной строкой формата, которая включает один или несколько элементов формата. Каждому элементу формата назначается числовой индекс, начиная с 0. Помимо исходной строки вызов метода должен содержать дополнительные аргументы, число которых соответствует количеству значений индекса. Например, строка, элементы формата которой имеют индексы 0 и 1, должна иметь 2 аргумента. Для строки с индексами от 0 до 5 потребуется 6 аргументов. После этого компилятор языка будет разрешать вызов метода в конкретную перегрузку метода String.Format.

Дополнительные сведения об использовании метода String.Format см. в статьях Начало работы с методом String.Format и Выбор вызываемого метода.

Пример. форматирование двух аргументов

В этом примере используется Format(String, Object, Object) метод для вывода данных о времени и температуре, хранящихся в универсальном Dictionary<TKey,TValue> объекте. Обратите внимание, что строка формата имеет три элемента форматирования, хотя для форматирования существует только два объекта. Это происходит потому, что первый объект в списке (значение даты и времени) используется двумя элементами форматирования: в первом элементе форматирования отображается время, а во втором отображается дата.

using namespace System;
using namespace System::Collections::Generic;

void main()
{
   Dictionary<DateTime, Double>^ temperatureInfo = gcnew Dictionary<DateTime, Double>(); 
   temperatureInfo->Add(DateTime(2010, 6, 1, 14, 0, 0), 87.46);
   temperatureInfo->Add(DateTime(2010, 12, 1, 10, 0, 0), 36.81);
      
   Console::WriteLine("Temperature Information:\n");
   String^ output;   
   for each (KeyValuePair<DateTime, Double>^ item in temperatureInfo)
   {
      output = String::Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}�F", 
                              item->Key, item->Value);
      Console::WriteLine(output);
   }
}
// The example displays the following output:
//       Temperature Information:
//       
//       Temperature at  2:00 PM on  6/1/2010:  87.5�F
//       Temperature at 10:00 AM on 12/1/2010:  36.8�F
Dictionary<DateTime, Double> temperatureInfo = new Dictionary<DateTime, Double>(); 
temperatureInfo.Add(new DateTime(2010, 6, 1, 14, 0, 0), 87.46);
temperatureInfo.Add(new DateTime(2010, 12, 1, 10, 0, 0), 36.81);

Console.WriteLine("Temperature Information:\n");
string output;   
foreach (var item in temperatureInfo)
{
   output = String.Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}°F", 
                          item.Key, item.Value);
   Console.WriteLine(output);
}
// The example displays output like the following:
//       Temperature Information:
//       
//       Temperature at  2:00 PM on  6/1/2010:  87.5°F
//       Temperature at 10:00 AM on 12/1/2010:  36.8°F
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim temperatureInfo As New Dictionary(Of Date, Double) 
      temperatureInfo.Add(#6/1/2010 2:00PM#, 87.46)
      temperatureInfo.Add(#12/1/2010 10:00AM#, 36.81)
      
      Console.WriteLine("Temperature Information:")
      Console.WriteLine()
      Dim output As String   
      For Each item In temperatureInfo
         output = String.Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}°F", _
                                item.Key, item.Value)
         Console.WriteLine(output)
      Next
   End Sub
End Module
' The example displays the following output:
'       Temperature Information:
'       
'       Temperature at  2:00 PM on  6/1/2010:  87.5°F
'       Temperature at 10:00 AM on 12/1/2010:  36.8°F

См. также раздел

Применяется к

Format(IFormatProvider, String, Object, Object)

Заменяет элементы формата в строке строковым представлением двух указанных объектов. Параметр предоставляет сведения об особенностях форматирования, связанных с языком и региональными параметрами.

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, System::Object ^ arg0, System::Object ^ arg1);
public static string Format (IFormatProvider provider, string format, object arg0, object arg1);
public static string Format (IFormatProvider? provider, string format, object? arg0, object? arg1);
static member Format : IFormatProvider * string * obj * obj -> string
Public Shared Function Format (provider As IFormatProvider, format As String, arg0 As Object, arg1 As Object) As String

Параметры

provider
IFormatProvider

Объект, предоставляющий сведения о форматировании для определенного языка и региональных параметров.

arg0
Object

Первый объект для форматирования.

arg1
Object

Второй объект для форматирования.

Возвращаемое значение

String

Копия format, в которой все элементы формата заменены строковыми представлениями arg0 и arg1.

Исключения

format имеет значение null.

format недопустим.

-или-

Индекс элемента формата не равен нулю или единице.

Комментарии

Важно!

Вместо вызова метода String.Format или использования строк составного формата можно использовать интерполированные строки, если ваш язык их поддерживает. Интерполированная строка — это строка, которая содержит интерполированные выражения. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).

Этот метод использует функцию составного форматирования для преобразования двух выражений в их строковые представления и встраивания этих представлений в строку. При выполнении преобразования метод использует форматирование с учетом языка и региональных параметров или пользовательский модуль форматирования. Метод преобразует каждый Object аргумент в свое строковое представление путем вызова его метода ToString (IFormatProvider) или, если соответствующий элемент форматирования объекта включает строку формата, вызывая его метод ToString (String, IFormatProvider) . Если эти методы не существуют, вызывается метод ToString без параметров объекта.

Тем не менее при вызове метода String.Format необязательно учитывать конкретную перегрузку, которую требуется вызвать. Вместо этого можно вызвать этот метод с использованием объекта, который предоставляет зависящее от языка и региональных параметров или настраиваемое форматирование, а также составной строки формата, которая включает один или несколько элементов формата. Каждому элементу формата назначается числовой индекс, начиная с 0. Помимо исходной строки вызов метода должен содержать дополнительные аргументы, число которых соответствует количеству значений индекса. Например, строка, элементы формата которой имеют индексы 0 и 1, должна иметь 2 аргумента. Для строки с индексами от 0 до 5 потребуется 6 аргументов. После этого компилятор языка будет разрешать вызов метода в конкретную перегрузку метода String.Format.

Дополнительные сведения об использовании метода String.Format см. в статьях Начало работы с методом String.Format и Выбор вызываемого метода.

Применяется к

Format(String, Object, Object, Object)

Заменяет элементы формата в строке строковым представлением трех указанных объектов.

public:
 static System::String ^ Format(System::String ^ format, System::Object ^ arg0, System::Object ^ arg1, System::Object ^ arg2);
public static string Format (string format, object arg0, object arg1, object arg2);
public static string Format (string format, object? arg0, object? arg1, object? arg2);
static member Format : string * obj * obj * obj -> string
Public Shared Function Format (format As String, arg0 As Object, arg1 As Object, arg2 As Object) As String

Параметры

arg0
Object

Первый объект для форматирования.

arg1
Object

Второй объект для форматирования.

arg2
Object

Третий объект для форматирования.

Возвращаемое значение

String

Копия format, в которой все элементы формата заменены строковыми представлениями arg0, arg1 и arg2.

Исключения

format имеет значение null.

format недопустим.

-или-

Индекс элемента формата меньше нуля или больше двух.

Комментарии

Важно!

Вместо вызова метода String.Format или использования строк составного формата можно использовать интерполированные строки, если ваш язык их поддерживает. Интерполированная строка — это строка, которая содержит интерполированные выражения. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).

Этот метод использует функцию составного форматирования для преобразования значений трех выражений в их строковые представления и встраивания этих представлений в строку.

Тем не менее при вызове метода String.Format необязательно учитывать конкретную перегрузку, которую требуется вызвать. Вместо этого можно вызвать метод с составной строкой формата, которая включает один или несколько элементов формата. Каждому элементу формата назначается числовой индекс, начиная с 0. Помимо исходной строки вызов метода должен содержать дополнительные аргументы, число которых соответствует количеству значений индекса. Например, строка, элементы формата которой имеют индексы 0 и 1, должна иметь 2 аргумента. Для строки с индексами от 0 до 5 потребуется 6 аргументов. После этого компилятор языка будет разрешать вызов метода в конкретную перегрузку метода String.Format.

Дополнительные сведения об использовании метода String.Format см. в статьях Начало работы с методом String.Format и Выбор вызываемого метода.

Пример. форматирование трех аргументов

В этом примере Format(String, Object, Object, Object) метод используется для создания строки, которая иллюстрирует результат логической And операции с двумя целочисленными значениями. Обратите внимание, что строка формата включает шесть элементов форматирования, но в списке параметров метода есть только три элемента, поскольку каждый элемент форматируется двумя разными способами.

using namespace System;

void main()
{
   String^ formatString = "    {0,10} ({0,8:X8})\n" + 
                           "And {1,10} ({1,8:X8})\n" + 
                           "  = {2,10} ({2,8:X8})";
   int value1 = 16932;
   int value2 = 15421;
   String^ result = String::Format(formatString, 
                                   value1, value2, value1 & value2);
   Console::WriteLine(result);
}
// The example displays the following output:
//                16932 (00004224)
//       And      15421 (00003C3D)
//         =         36 (00000024)
string formatString = "    {0,10} ({0,8:X8})\n" + 
                      "And {1,10} ({1,8:X8})\n" + 
                      "  = {2,10} ({2,8:X8})";
int value1 = 16932;
int value2 = 15421;
string result = String.Format(formatString, 
                              value1, value2, value1 & value2);
Console.WriteLine(result);
// The example displays the following output:
//                16932 (00004224)
//       And      15421 (00003C3D)
//         =         36 (00000024)
Public Module Example
   Public Sub Main()
      Dim formatString As String = "    {0,10} ({0,8:X8})" + vbCrLf +  _
                                   "And {1,10} ({1,8:X8})" + vbCrLf + _
                                   "  = {2,10} ({2,8:X8})"
      Dim value1 As Integer = 16932
      Dim value2 As Integer = 15421
      Dim result As String = String.Format(formatString, _
                                           value1, value2, value1 And value2)
      Console.WriteLine(result)                          
   End Sub
End Module
' The example displays the following output:
'                16932 (00004224)
'       And      15421 (00003C3D)
'         =         36 (00000024)

См. также раздел

Применяется к

Format(IFormatProvider, String, Object, Object, Object)

Заменяет элементы формата в строке строковым представлением трех указанных объектов. Параметр предоставляет сведения об особенностях форматирования, связанных с языком и региональными параметрами.

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, System::Object ^ arg0, System::Object ^ arg1, System::Object ^ arg2);
public static string Format (IFormatProvider provider, string format, object arg0, object arg1, object arg2);
public static string Format (IFormatProvider? provider, string format, object? arg0, object? arg1, object? arg2);
static member Format : IFormatProvider * string * obj * obj * obj -> string
Public Shared Function Format (provider As IFormatProvider, format As String, arg0 As Object, arg1 As Object, arg2 As Object) As String

Параметры

provider
IFormatProvider

Объект, предоставляющий сведения о форматировании для определенного языка и региональных параметров.

arg0
Object

Первый объект для форматирования.

arg1
Object

Второй объект для форматирования.

arg2
Object

Третий объект для форматирования.

Возвращаемое значение

String

Копия format, в которой все элементы формата заменены строковыми представлениями arg0, arg1 и arg2.

Исключения

format имеет значение null.

format недопустим.

-или-

Индекс элемента формата меньше нуля или больше двух.

Комментарии

Важно!

Вместо вызова метода String.Format или использования строк составного формата можно использовать интерполированные строки, если ваш язык их поддерживает. Интерполированная строка — это строка, которая содержит интерполированные выражения. Каждое интерполированное выражение завершается значением выражения и включается в строку результатов, если строка назначена. Дополнительные сведения см. в разделе Интерполяция строк (справочник по C#) и Интерполированные строки (справочник по Visual Basic).

Этот метод использует функцию составного форматирования для преобразования трех выражений в их строковые представления и встраивания этих представлений в строку. При выполнении преобразования метод использует форматирование с учетом языка и региональных параметров или пользовательский модуль форматирования. Метод преобразует каждый Object аргумент в свое строковое представление путем вызова его метода ToString (IFormatProvider) или, если соответствующий элемент форматирования объекта включает строку формата, вызывая его метод ToString (String, IFormatProvider) . Если эти методы не существуют, вызывается метод ToString без параметров объекта.

Тем не менее при вызове метода String.Format необязательно учитывать конкретную перегрузку, которую требуется вызвать. Вместо этого можно вызвать этот метод с использованием объекта, который предоставляет зависящее от языка и региональных параметров или настраиваемое форматирование, а также составной строки формата, которая включает один или несколько элементов формата. Каждому элементу формата назначается числовой индекс, начиная с 0. Помимо исходной строки вызов метода должен содержать дополнительные аргументы, число которых соответствует количеству значений индекса. Например, строка, элементы формата которой имеют индексы 0 и 1, должна иметь 2 аргумента. Для строки с индексами от 0 до 5 потребуется 6 аргументов. После этого компилятор языка будет разрешать вызов метода в конкретную перегрузку метода String.Format.

Дополнительные сведения об использовании метода String.Format см. в статьях Начало работы с методом String.Format и Выбор вызываемого метода.

Применяется к