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 интерфейс . Типы, поддерживающие строки формата:
Все целочисленные типы и типы с плавающей запятой. (См. статью Строки стандартного числового формата и Строки пользовательского числового формата.)
DateTime и DateTimeOffset. (См. статью Стандартные строки формата даты и времени и Строки пользовательского формата даты и времени.)
Все типы перечисления. (См. раздел Строки формата перечисления.)
значения типа TimeSpan. (См. статьи Стандартные строки формата TimeSpan и Настраиваемые строки формата TimeSpan.)
Идентификаторы GUID. (См. Guid.ToString(String) метод.)
Однако обратите внимание, что любой пользовательский тип может реализовывать 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 в качестве аргумента provider
Format, метод вызывает свою IFormatProvider.GetFormat реализацию и запрашивает объект типа ICustomFormatter. Затем он вызывает метод возвращенного ICustomFormatter объекта для форматирования Format каждого элемента форматирования в передаваемой ему составной строке.
Дополнительные сведения о предоставлении пользовательских решений форматирования см. в статье Практическое руководство. Определение и использование поставщиков настраиваемых числовых форматов и ICustomFormatter. Пример преобразования целых чисел в форматированные пользовательские числа см. в разделе Пример. Пользовательская операция форматирования. Пример преобразования неподписанных байтов в римские числа см. в разделе Пример: поставщик перехвата и римский числовый форматировщик.
Пример. Пользовательская операция форматирования
В этом примере определяется поставщик формата, который форматирует целочисленное значение в виде номера счета клиента в формате x-xxxxx-xx.
using namespace System;
ref class CustomerFormatter : IFormatProvider, ICustomFormatter
{
public:
virtual Object^ GetFormat(Type^ formatType)
{
if (formatType == ICustomFormatter::typeid)
return this;
else
return nullptr;
}
virtual String^ Format(String^ format,
Object^ arg,
IFormatProvider^ formatProvider)
{
if (! this->Equals(formatProvider))
{
return nullptr;
}
else
{
if (String::IsNullOrEmpty(format))
format = "G";
String^ customerString = arg->ToString();
if (customerString->Length < 8)
customerString = customerString->PadLeft(8, '0');
format = format->ToUpper();
if (format == L"G")
return customerString->Substring(0, 1) + "-" +
customerString->Substring(1, 5) + "-" +
customerString->Substring(6);
else if (format == L"S")
return customerString->Substring(0, 1) + "/" +
customerString->Substring(1, 5) + "/" +
customerString->Substring(6);
else if (format == L"P")
return customerString->Substring(0, 1) + "." +
customerString->Substring(1, 5) + "." +
customerString->Substring(6);
else
throw gcnew FormatException(
String::Format("The '{0}' format specifier is not supported.", format));
}
}
};
void main()
{
int acctNumber = 79203159;
Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0}", acctNumber));
Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:G}", acctNumber));
Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:S}", acctNumber));
Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:P}", acctNumber));
try {
Console::WriteLine(String::Format(gcnew CustomerFormatter, "{0:X}", acctNumber));
}
catch (FormatException^ e) {
Console::WriteLine(e->Message);
}
}
// The example displays the following output:
// 7-92031-59
// 7-92031-59
// 7/92031/59
// 7.92031.59
// The 'X' format specifier is not supported.
using System;
public class TestFormatter
{
public static void Main()
{
int acctNumber = 79203159;
Console.WriteLine(String.Format(new CustomerFormatter(), "{0}", acctNumber));
Console.WriteLine(String.Format(new CustomerFormatter(), "{0:G}", acctNumber));
Console.WriteLine(String.Format(new CustomerFormatter(), "{0:S}", acctNumber));
Console.WriteLine(String.Format(new CustomerFormatter(), "{0:P}", acctNumber));
try {
Console.WriteLine(String.Format(new CustomerFormatter(), "{0:X}", acctNumber));
}
catch (FormatException e) {
Console.WriteLine(e.Message);
}
}
}
public class CustomerFormatter : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
else
return null;
}
public string Format(string format,
object arg,
IFormatProvider formatProvider)
{
if (! this.Equals(formatProvider))
{
return null;
}
else
{
if (String.IsNullOrEmpty(format))
format = "G";
string customerString = arg.ToString();
if (customerString.Length < 8)
customerString = customerString.PadLeft(8, '0');
format = format.ToUpper();
switch (format)
{
case "G":
return customerString.Substring(0, 1) + "-" +
customerString.Substring(1, 5) + "-" +
customerString.Substring(6);
case "S":
return customerString.Substring(0, 1) + "/" +
customerString.Substring(1, 5) + "/" +
customerString.Substring(6);
case "P":
return customerString.Substring(0, 1) + "." +
customerString.Substring(1, 5) + "." +
customerString.Substring(6);
default:
throw new FormatException(
String.Format("The '{0}' format specifier is not supported.", format));
}
}
}
}
// The example displays the following output:
// 7-92031-59
// 7-92031-59
// 7/92031/59
// 7.92031.59
// The 'X' format specifier is not supported.
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.
Где можно найти список стандартных строк формата, которые можно использовать с элементами форматирования?
Сведения обо всех целочисленных типах и типах с плавающей запятой см. в разделах Строки стандартного числового формата и Строки пользовательского числового формата.
Значения даты и времени см. в разделах Стандартные строки формата даты и времени и Настраиваемые строки формата даты и времени.
Значения перечисления см. в разделе Строки формата перечисления.
Значения TimeSpan см. в разделах Стандартные строки формата TimeSpan и Настраиваемые строки формата TimeSpan.
Значения Guid см. в разделе Примечания страницы справочника Guid.ToString(String) .
Разделы справки управлять выравниванием результирующих строк, заменяющих элементы форматирования?
Общий синтаксис элемента формата:
{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
.
Комментарии
Важно!
Вместо вызова метода 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
.
Комментарии
Важно!
Вместо вызова метода 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
.
Комментарии
Важно!
Вместо вызова метода 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
.
Комментарии
Важно!
Вместо вызова метода 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
См. также раздел
- Типы форматирования в .NET
- Составное форматирование
- Строки стандартных форматов даты и времени
- Строки настраиваемых форматов даты и времени
- Строки стандартных числовых форматов
- Строки настраиваемых числовых форматов
- Строки стандартного формата TimeSpan
- Строки настраиваемого формата TimeSpan
- Строки форматов перечисления
Применяется к
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
Объект, предоставляющий сведения о форматировании для определенного языка и региональных параметров.
- format
- CompositeFormat
- 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
.
Комментарии
Важно!
Вместо вызова метода 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
См. также раздел
- DateTimeFormatInfo
- ICustomFormatter
- IFormatProvider
- NumberFormatInfo
- Типы форматирования в .NET
- Составное форматирование
- Строки стандартных форматов даты и времени
- Строки настраиваемых форматов даты и времени
- Строки стандартных числовых форматов
- Строки настраиваемых числовых форматов
- Строки стандартного формата TimeSpan
- Строки настраиваемого формата TimeSpan
- Строки форматов перечисления
Применяется к
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
См. также раздел
- Типы форматирования в .NET
- Составное форматирование
- Строки стандартных форматов даты и времени
- Строки настраиваемых форматов даты и времени
- Строки стандартных числовых форматов
- Строки настраиваемых числовых форматов
- Строки стандартного формата TimeSpan
- Строки настраиваемого формата TimeSpan
- Строки форматов перечисления
Применяется к
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
.
Комментарии
Важно!
Вместо вызова метода 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.
См. также раздел
- Типы форматирования в .NET
- Составное форматирование
- Строки стандартных форматов даты и времени
- Строки настраиваемых форматов даты и времени
- Строки стандартных числовых форматов
- Строки настраиваемых числовых форматов
- Строки стандартного формата TimeSpan
- Строки настраиваемого формата TimeSpan
- Строки форматов перечисления
Применяется к
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
Объект, предоставляющий сведения о форматировании для определенного языка и региональных параметров.
- format
- CompositeFormat
- 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
Объект, предоставляющий сведения о форматировании для определенного языка и региональных параметров.
- format
- CompositeFormat
- 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
Объект, предоставляющий сведения о форматировании для определенного языка и региональных параметров.
- format
- CompositeFormat
- 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
Объект, предоставляющий сведения о форматировании для определенного языка и региональных параметров.
- format
- CompositeFormat
- arg0
- TArg0
Первый объект для форматирования.
Возвращаемое значение
Форматированная строка.
Исключения
format
имеет значение null
.
Индекс элемента формата больше или равен числу предоставленных аргументов.
Применяется к
Обратная связь
Отправить и просмотреть отзыв по