String.Format Метод

Определение

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

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

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

Перегрузки

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

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

Format(String, Object, Object, Object)

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

Format(IFormatProvider, String, Object, Object)

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

Format(String, Object, Object)

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

Format(IFormatProvider, CompositeFormat, ReadOnlySpan<Object>)

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

Format(IFormatProvider, String, Object)

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

Format(IFormatProvider, String, Object[])

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

Format(String, Object[])

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

Format(String, Object)

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

Format(IFormatProvider, CompositeFormat, Object[])

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

Format<TArg0,TArg1,TArg2>(IFormatProvider, CompositeFormat, TArg0, TArg1, TArg2)

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

Format<TArg0,TArg1>(IFormatProvider, CompositeFormat, TArg0, TArg1)

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

Format<TArg0>(IFormatProvider, CompositeFormat, TArg0)

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

Примеры

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

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

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

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

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

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

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

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

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

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

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

Комментарии

Важно!

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

Содержание

Начало работы с методом String.Format
Какой метод следует вызвать?
Краткое описание метода Format
Элемент Format
Форматирование аргументов
Форматирование элементов с одинаковым индексом
Форматирование и язык и региональные параметры
Пользовательские операции форматирования
String.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.
let pricePerOunce = 17.36m
String.Format("The current price is {0} per ounce.", pricePerOunce)
|> printfn "%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.
let pricePerOunce = 17.36m
String.Format("The current price is {0:C2} per ounce.", pricePerOunce)
|> printfn "%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.'
let temp = 20.4m
String.Format("The temperature is {0}°C.", temp)
|> printfn "%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.'
String.Format("At {0}, the temperature is {1}°C.", DateTime.Now, 20.4)
|> printfn "%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'
String.Format("It is now {0:d} at {0:t}", DateTime.Now)
|> printfn "%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
open System
open System.Text
 
let years = [| 2013; 2014; 2015 |]
let population = [| 1025632; 1105967; 1148203 |]
let sb = StringBuilder()
sb.Append(String.Format("{0,6} {1,15}\n\n", "Year", "Population")) |> ignore
for i = 0 to years.Length - 1 do
   sb.Append(String.Format("{0,6} {1,15:N0}\n", years[i], population[i])) |> ignore

printfn $"{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
let years = [| 2013; 2014; 2015 |]
let population = [| 1025632; 1105967; 1148203 |]
let mutable s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population")
for i = 0 to years.Length - 1 do
    s <- s + String.Format("{0,-10} {1,-10:N0}\n", years[i], population[i])
printfn $"\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.
open System

let dat = DateTime(2012, 1, 17, 9, 30, 0) 
let city = "Chicago"
let temp = -16
String.Format("At {0} in {1}, the temperature was {2} degrees.", dat, city, temp)
|> printfn "%s"
// 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);
open System

String.Format("{0,-10:C}", 126347.89m)         
|> printfn "%s"
String.Format("{0,-10:C}", 126347.89d)

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

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

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

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

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 %
// Create a list of 5-tuples with population data for three U.S. cities, 1940-1950.
let cities = 
    [ "Los Angeles", DateTime(1940, 1, 1), 1504277, DateTime(1950, 1, 1), 1970358
      "New York", DateTime(1940, 1, 1), 7454995, DateTime(1950, 1, 1), 7891957
      "Chicago", DateTime(1940, 1, 1), 3396808, DateTime(1950, 1, 1), 3620962
      "Detroit", DateTime(1940, 1, 1), 1623452, DateTime(1950, 1, 1), 1849568 ]

// Display header
String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n", "City", "Year", "Population", "Change (%)")
|> printfn "%s"

for name, year1, pop1, year2, pop2 in cities do
    String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                  name, year1, pop1, year2, pop2,
                  double (pop2 - pop1) / double pop1)
    |> printfn "%s"
// 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 Если реализация доступна и создает строку, не являющуюся пустой, эта строка возвращается в виде строкового представления аргумента; в противном случае выполняется следующий шаг.

  • Если аргумент реализует 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
open System

let values= [| Int16.MinValue; -27s; 0s; 1042s; Int16.MaxValue |]
printfn "%10s  %10s\n" "Decimal" "Hex"
for value in values do
    String.Format("{0,10:G}: {0,10:X}", value)
    |> printfn "%s"
// 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 в качестве аргумента providerFormat, метод вызывает свою 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.
open System

type CustomerFormatter() = 
    interface IFormatProvider with
        member this.GetFormat(formatType) =
            if formatType = typeof<ICustomFormatter> then
                this
            else
                null

    interface ICustomFormatter with
        member this.Format(format, arg, formatProvider: IFormatProvider) = 
            if this.Equals formatProvider |> not then
                null
            else
                let format = 
                    if String.IsNullOrEmpty format then "G"
                    else format.ToUpper()
                
                let customerString = 
                    let s = string arg
                    if s.Length < 8 then
                        s.PadLeft(8, '0')
                    else s
                
                match format with
                | "G" ->
                    customerString.Substring(0, 1) + "-" +
                        customerString.Substring(1, 5) + "-" +
                        customerString.Substring 6
                | "S" ->                          
                    customerString.Substring(0, 1) + "/" +
                        customerString.Substring(1, 5) + "/" +
                        customerString.Substring 6
                | "P" ->                          
                    customerString.Substring(0, 1) + "." +
                        customerString.Substring(1, 5) + "." +
                        customerString.Substring 6
                | _ ->
                    raise (FormatException $"The '{format}' format specifier is not supported.")

let acctNumber = 79203159
String.Format(CustomerFormatter(), "{0}", acctNumber)
|> printfn "%s"
String.Format(CustomerFormatter(), "{0:G}", acctNumber)
|> printfn "%s"
String.Format(CustomerFormatter(), "{0:S}", acctNumber)
|> printfn "%s"
String.Format(CustomerFormatter(), "{0:P}", acctNumber)
|> printfn "%s"
try
    String.Format(CustomerFormatter(), "{0:X}", acctNumber)
    |> printfn "%s"
with :? FormatException as e ->
    printfn $"{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.
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.

Пример: поставщик перехвата и римский числовый форматировщик

В этом примере определяется пользовательский поставщик формата, реализующий 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
open System
open System.Globalization

type InterceptProvider() =
    interface IFormatProvider with
        member this.GetFormat(formatType) =
            if formatType = typeof<ICustomFormatter> then
                this
            else
                null
    interface ICustomFormatter with
        member _.Format(format, obj, provider: IFormatProvider) = 
            // Display information about method call.
            let formatString =
                if format = null then "<null>" else format
            printfn $"Provider: {provider.GetType().Name}, Object: %A{obj}, Format String: %s{formatString}"
                                
            if obj = null then
                String.Empty
            else
                // If this is a byte and the "R" format string, format it with Roman numerals.
                match obj with
                | :? byte as value when formatString.ToUpper().Equals "R" -> 
                    let mutable returnString = String.Empty

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

                // Use default for all other formatting.
                | :? IFormattable as x ->
                    x.ToString(format, CultureInfo.CurrentCulture)
                | _ ->
                    string obj

let n = 10
let value = 16.935
let day = DateTime.Now
let provider = InterceptProvider()
String.Format(provider, "{0:N0}: {1:C2} on {2:d}\n", n, value, day)
|> printfn "%s"
String.Format(provider, "{0}: {1:F}\n", "Today: ", DateTime.Now.DayOfWeek)
|> printfn "%s"
String.Format(provider, "{0:X}, {1}, {2}\n", 2uy, 12uy, 199uy)
|> printfn "%s"
String.Format(provider, "{0:R}, {1:R}, {2:R}\n", 2uy, 12uy, 199uy)
|> printfn "%s"
// 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

String.Format 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.
open System

let names = [| "Balto"; "Vanya"; "Dakota"; "Samuel"; "Koani"; "Yiska"; "Yuma" |]
let output = 
    names[0] + ", " + names[1] + ", " + names[2] + ", " + 
    names[3] + ", " + names[4] + ", " + names[5] + ", " + 
    names[6] + "\n"

let date = DateTime.Now
output + String.Format("It is {0:t} on {0:d}. The day of the week is {1}.", date, date.DayOfWeek)
|> printfn "%s"
// 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.
open System

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

let date = DateTime.Now
output + $"\nIt is {date:t} on {date:d}. The day of the week is {date.DayOfWeek}."
|> printfn "%s" 
// 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]}

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

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

Все строки стандартного числового формата , за исключением "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 %
open System

let values: obj list = [ 1603, 1794.68235, 15436.14 ]
for value in values do
   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.)
   |> printfn "%s"
// 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
let value = 16309.5436m
String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}", value)
|> printfn "%s"
// 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
open System

let value = 1326
String.Format("{0,10:D6} {0,10:X8}", value)
|> printfn "%s"
// 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
open System

let value = 16342
String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}", value)
|> printfn "%s"
// 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);
let 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);
let 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} '{1}' characters and {2} '{3}' characters.",
                       nOpen, "{", nClose, "}");
Console.WriteLine(result);
let result =
    String.Format("The text has {0} '{1}' characters and {2} '{3}' characters.", nOpen, "{", nClose, "}")
result = String.Format("The text has {0} '{1}' characters and {2} '{3}' characters.",
                       nOpen, "{", nClose, "}")

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

Наиболее распространенной причиной исключения является то, что индекс элемента формата не соответствует объекту в списке форматов. Обычно это означает, что вы неправильно нумерировали индексы элементов формата или забыли включить объект в список форматов. Попытка включить неэкранированную левую или правую фигурную скобку также вызывает исключение 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);
open System

let rnd = Random()
let mutable total = 0
let numbers = Array.zeroCreate<int> 4
for i = 0 to 2 do
   let number = rnd.Next 1001
   numbers[i] <- number
   total <- 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) метод . Исключение возникает из-за того, что в списке форматирования есть четыре элемента формата, но только один элемент.

Так как ни 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);
open System

let rnd = Random()
let numbers = Array.zeroCreate<int> 4
let mutable total = 0
for i = 0 to 2 do
   let number = rnd.Next 1001
   numbers[i] <- number
   total <- total + number
numbers[3] <- total
let values = Array.zeroCreate<obj> 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(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

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

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

Копия 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 и Выбор вызываемого метода.

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

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

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

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

Копия 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)
open System

let formatString = 
    "    {0,10} ({0,8:X8})\nAnd {1,10} ({1,8:X8})\n  = {2,10} ({2,8:X8})"

let value1 = 16932
let value2 = 15421
String.Format(formatString, value1, value2, value1 &&& value2)
|> printfn "%s"
// 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)

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

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

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

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

Копия 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)

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

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

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

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

Копия 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
open System
open System.Collections.Generic

let temperatureInfo = Dictionary<DateTime, float>() 
temperatureInfo.Add(DateTime(2010, 6, 1, 14, 0, 0), 87.46)
temperatureInfo.Add(DateTime(2010, 12, 1, 10, 0, 0), 36.81)

printfn $"Temperature Information:\n"
for item in temperatureInfo do
   String.Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}°F", item.Key, item.Value)
   |> printfn "%s"
// 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, CompositeFormat, ReadOnlySpan<Object>)

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

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::Text::CompositeFormat ^ format, ReadOnlySpan<System::Object ^> args);
public static string Format (IFormatProvider? provider, System.Text.CompositeFormat format, ReadOnlySpan<object?> args);
static member Format : IFormatProvider * System.Text.CompositeFormat * ReadOnlySpan<obj> -> string
Public Shared Function Format (provider As IFormatProvider, format As CompositeFormat, args As ReadOnlySpan(Of Object)) As String

Параметры

provider
IFormatProvider

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

args
ReadOnlySpan<Object>

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

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

Форматированная строка.

Исключения

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

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

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

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

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

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

Копия 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[]

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

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

Копия 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
open System
open System.Globalization

let cultureNames = [| "en-US"; "fr-FR"; "de-DE"; "es-ES" |]

let dateToDisplay = DateTime(2009, 9, 1, 18, 32, 0)
let value = 9164.32

printfn "Culture     Date                                Value\n"
for cultureName in cultureNames do
    let culture = CultureInfo cultureName
    String.Format(culture, "{0,-11} {1,-35:D} {2:N}", culture.Name, dateToDisplay, value)
    |> printfn "%s"
// 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[])

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

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[]

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

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

Копия 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)
let date1 = DateTime(2009, 7, 1)
let hiTime = TimeSpan(14, 17, 32)
let hiTemp = 62.1m 
let loTime = TimeSpan(3, 16, 10)
let loTemp = 54.8m 

String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", date1, hiTime, hiTemp, loTime, loTemp)
|> printfn "%s\n"
      
String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", [| date1 :> obj; hiTime; hiTemp; loTime; loTemp |])
|> printfn "%s"
// 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
open System

type CityInfo =
  { Name: string
    Population: int
    Area: Decimal
    Year: int }

let showPopulationData city =
    let args: obj[] = [| city.Name; city.Year; city.Population; city.Area |]
    String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", args)
    |> printfn "%s"

{ Name = "New York"; Population = 8175133; Area = 302.64m; Year = 2010 }
|> showPopulationData

 
{ Name = "Seattle"; Population = 608660; Area = 83.94m; Year = 2010 }      
|> showPopulationData 

// 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(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

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

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

Копия 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.
let birthdate = DateTime(1993, 7, 28)
let dates = 
    [ DateTime(1993, 8, 16) 
      DateTime(1994, 7, 28)
      DateTime(2000, 10, 16)
      DateTime(2003, 7, 27)
      DateTime(2007, 5, 27) ]

for dateValue in dates do
    let interval = dateValue - birthdate
    // Get the approximate number of years, without accounting for leap years.
    let years = (int interval.TotalDays) / 365
    // See if adding the number of years exceeds dateValue.
    if birthdate.AddYears years <= dateValue then
        String.Format("You are now {0} years old.", years)
    else
        String.Format("You are now {0} years old.", years - 1)
    |> printfn "%s"
// 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(IFormatProvider, CompositeFormat, Object[])

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

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

Параметры

provider
IFormatProvider

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

args
Object[]

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

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

Форматированная строка.

Исключения

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

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

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

Format<TArg0,TArg1,TArg2>(IFormatProvider, CompositeFormat, TArg0, TArg1, TArg2)

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

public:
generic <typename TArg0, typename TArg1, typename TArg2>
 static System::String ^ Format(IFormatProvider ^ provider, System::Text::CompositeFormat ^ format, TArg0 arg0, TArg1 arg1, TArg2 arg2);
public static string Format<TArg0,TArg1,TArg2> (IFormatProvider? provider, System.Text.CompositeFormat format, TArg0 arg0, TArg1 arg1, TArg2 arg2);
static member Format : IFormatProvider * System.Text.CompositeFormat * 'TArg0 * 'TArg1 * 'TArg2 -> string
Public Shared Function Format(Of TArg0, TArg1, TArg2) (provider As IFormatProvider, format As CompositeFormat, arg0 As TArg0, arg1 As TArg1, arg2 As TArg2) As String

Параметры типа

TArg0

Тип первого отформатируемого объекта.

TArg1

Тип второго отформатируемого объекта.

TArg2

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

Параметры

provider
IFormatProvider

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

arg0
TArg0

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

arg1
TArg1

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

arg2
TArg2

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

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

Форматированная строка.

Исключения

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

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

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

Format<TArg0,TArg1>(IFormatProvider, CompositeFormat, TArg0, TArg1)

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

public:
generic <typename TArg0, typename TArg1>
 static System::String ^ Format(IFormatProvider ^ provider, System::Text::CompositeFormat ^ format, TArg0 arg0, TArg1 arg1);
public static string Format<TArg0,TArg1> (IFormatProvider? provider, System.Text.CompositeFormat format, TArg0 arg0, TArg1 arg1);
static member Format : IFormatProvider * System.Text.CompositeFormat * 'TArg0 * 'TArg1 -> string
Public Shared Function Format(Of TArg0, TArg1) (provider As IFormatProvider, format As CompositeFormat, arg0 As TArg0, arg1 As TArg1) As String

Параметры типа

TArg0

Тип первого отформатируемого объекта.

TArg1

Тип второго отформатируемого объекта.

Параметры

provider
IFormatProvider

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

arg0
TArg0

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

arg1
TArg1

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

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

Форматированная строка.

Исключения

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

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

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

Format<TArg0>(IFormatProvider, CompositeFormat, TArg0)

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

public:
generic <typename TArg0>
 static System::String ^ Format(IFormatProvider ^ provider, System::Text::CompositeFormat ^ format, TArg0 arg0);
public static string Format<TArg0> (IFormatProvider? provider, System.Text.CompositeFormat format, TArg0 arg0);
static member Format : IFormatProvider * System.Text.CompositeFormat * 'TArg0 -> string
Public Shared Function Format(Of TArg0) (provider As IFormatProvider, format As CompositeFormat, arg0 As TArg0) As String

Параметры типа

TArg0

Тип первого отформатируемого объекта.

Параметры

provider
IFormatProvider

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

arg0
TArg0

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

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

Форматированная строка.

Исключения

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

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

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