Форматирование типов в .NETFormat types in .NET

Форматирование — это процесс преобразования экземпляра класса, структуры или значения перечисления в строковое представление. Результирующая строка затем демонстрируется пользователям или десериализуется для последующего восстановления значения с исходным типом данных.Formatting is the process of converting an instance of a class, structure, or enumeration value to its string representation, often so that the resulting string can be displayed to users or deserialized to restore the original data type. Преобразование может быть связано с рядом проблем:This conversion can pose a number of challenges:

  • Внутреннее представление значений необязательно соответствует тому виду, в котором они должны быть представлены пользователям.The way that values are stored internally does not necessarily reflect the way that users want to view them. Например, номер телефона может храниться в форме 8009999999, которая не отличается удобством для пользователей.For example, a telephone number might be stored in the form 8009999999, which is not user-friendly. Вместо этого номер должен отображаться в следующем виде: 800-999-9999.It should instead be displayed as 800-999-9999. См. в подразделе Строки настраиваемого формата пример, в котором число форматируется таким образом.See the Custom Format Strings section for an example that formats a number in this way.

  • Иногда порядок преобразования объекта в строковое представление неочевиден.Sometimes the conversion of an object to its string representation is not intuitive. Например, неясно, как должно выглядеть строковое представление объекта класса Temperature, представляющего температурные значения, или класса Person, представляющего данные о людях.For example, it is not clear how the string representation of a Temperature object or a Person object should appear. Пример, в котором объект Temperature форматируется различными способами, см. в подразделе Строки стандартного формата .For an example that formats a Temperature object in a variety of ways, see the Standard Format Strings section.

  • Для некоторых значений может потребоваться форматирование, учитывающее язык и региональные параметры.Values often require culture-sensitive formatting. Например, в приложении, где числа используются для обозначения денежных сумм, числовые строки должны включать символ текущей валюты, разделители групп (в большинстве случаев они совпадают с разделителями тысяч) и символ-разделитель целой и дробной частей.For example, in an application that uses numbers to reflect monetary values, numeric strings should include the current culture’s currency symbol, group separator (which, in most cultures, is the thousands separator), and decimal symbol. Пример см. в разделе Форматирование с учетом языка и региональных параметров с помощью поставщиков формата.For an example, see the Culture-sensitive formatting with format providers section.

  • Одно и то же значение может быть необходимо представить в приложении несколькими способами.An application may have to display the same value in different ways. Например, приложение может представлять элемент перечисления, отображая строковое представление его имени или его базовое значение.For example, an application may represent an enumeration member by displaying a string representation of its name or by displaying its underlying value. Пример, в котором член перечисления DayOfWeek форматируется различными способами, см в подразделе Строки стандартного формата .For an example that formats a member of the DayOfWeek enumeration in different ways, see the Standard Format Strings section.

Примечание

Форматирование приводит к преобразованию значения определенного типа в его строковое представление.Formatting converts the value of a type into a string representation. Обратной по отношению к форматированию операцией является анализ.Parsing is the inverse of formatting. В ходе анализа на основании строкового представления создается экземпляр некоторого типа данных.A parsing operation creates an instance of a data type from its string representation. Дополнительные сведения о преобразовании строк в другие типы данных см. в разделе Parsing Strings.For information about converting strings to other data types, see Parsing Strings.

Платформа .NET обеспечивает обширную поддержку форматирования, позволяя разработчикам справиться с описанными проблемами..NET provides rich formatting support that enables developers to address these requirements.

Форматирование в .NETFormatting in .NET

Основной механизм форматирования — это используемая по умолчанию реализация метода Object.ToString, описанная ниже в подразделе Форматирование по умолчанию с помощью метода ToString.The basic mechanism for formatting is the default implementation of the Object.ToString method, which is discussed in the Default Formatting Using the ToString Method section later in this topic. При этом платформа .NET предоставляет несколько способов изменения и расширения имеющихся по умолчанию возможностей форматирования.However, .NET provides several ways to modify and extend its default formatting support. В число этих требований входят следующие:These include the following:

  • Переопределение метода Object.ToString , позволяющее определить настраиваемое строковое представление значения объекта.Overriding the Object.ToString method to define a custom string representation of an object’s value. Дополнительные сведения см. ниже в разделе Переопределение метода ToString.For more information, see the Override the ToString Method section later in this topic.

  • Определение описателей формата, позволяющих использовать несколько видов строкового представления значения объекта.Defining format specifiers that enable the string representation of an object’s value to take multiple forms. Например, описатель формата "X" в следующем операторе позволяет преобразовать целое число в шестнадцатеричное строковое представление.For example, the "X" format specifier in the following statement converts an integer to the string representation of a hexadecimal value.

    int integerValue = 60312;
    Console.WriteLine(integerValue.ToString("X"));   // Displays EB98.
    
    Dim integerValue As Integer = 60312
    Console.WriteLine(integerValue.ToString("X"))   ' Displays EB98.
    

    Дополнительные сведения об описателях форматов см. в подразделе Метод ToString и строки формата .For more information about format specifiers, see the ToString Method and Format Strings section.

  • Использование поставщиков форматирования, позволяющих воспользоваться преимуществами соглашений о форматировании, присущих конкретному языку и региональным параметрам.Using format providers to take advantage of the formatting conventions of a specific culture. Например, следующий оператор выводит значение валюты с использованием соглашений о форматировании языка и региональных параметров "en-US".For example, the following statement displays a currency value by using the formatting conventions of the en-US culture.

    double cost = 1632.54; 
    Console.WriteLine(cost.ToString("C", 
                      new System.Globalization.CultureInfo("en-US")));   
    // The example displays the following output:
    //       $1,632.54
    
    Dim cost As Double = 1632.54
    Console.WriteLine(cost.ToString("C", New System.Globalization.CultureInfo("en-US")))
    ' The example displays the following output:
    '       $1,632.54
    

    Дополнительные сведения о форматировании с помощью поставщиков форматирования см. в разделе Поставщики форматирования.For more information about formatting with format providers, see the Format Providers section.

  • Реализация интерфейса IFormattable , позволяющая преобразовывать строки с помощью класса Convert и использовать составное форматирование.Implementing the IFormattable interface to support both string conversion with the Convert class and composite formatting. Дополнительные сведения см. в подразделе Интерфейс IFormattable .For more information, see the IFormattable Interface section.

  • Использование составного форматирования, позволяющее внедрить строковую презентацию в состав более крупной строки.Using composite formatting to embed the string representation of a value in a larger string. Дополнительные сведения см. в подразделе Составное форматирование .For more information, see the Composite Formatting section.

  • Реализация интерфейсов ICustomFormatter и IFormatProvider , позволяющая создать полноценное настраиваемое решение для форматирования.Implementing ICustomFormatter and IFormatProvider to provide a complete custom formatting solution. Дополнительные сведения см. в подразделе Настраиваемое форматирование с использованием интерфейса ICustomFormatter .For more information, see the Custom Formatting with ICustomFormatter section.

В следующих подразделах перечисленные методы преобразования объектов в их строковые представления рассматриваются более подробно.The following sections examine these methods for converting an object to its string representation.

Форматирование по умолчанию при помощи метода ToStringDefault formatting using the ToString method

Любой производный от System.Object тип автоматически наследует метод ToString без параметров, по умолчанию возвращающий имя типа.Every type that is derived from System.Object automatically inherits a parameterless ToString method, which returns the name of the type by default. В следующем примере демонстрируется использование метода ToString по умолчанию.The following example illustrates the default ToString method. Здесь определен класс с именем Automobile , у которого нет реализации.It defines a class named Automobile that has no implementation. При создании экземпляра этого класса и вызове его метода ToString отображается имя класса.When the class is instantiated and its ToString method is called, it displays its type name. Обратите внимание, что метод ToString не вызывается в примере явным образом.Note that the ToString method is not explicitly called in the example. Метод Console.WriteLine(Object) неявно вызывает метод ToString объекта, переданного ему в качестве аргумента.The Console.WriteLine(Object) method implicitly calls the ToString method of the object passed to it as an argument.

using System;

public class Automobile
{
   // No implementation. All members are inherited from Object.
}

public class Example
{
   public static void Main()
   {
      Automobile firstAuto = new Automobile();
      Console.WriteLine(firstAuto);
   }
}
// The example displays the following output:
//       Automobile
Public Class Automobile
   ' No implementation. All members are inherited from Object.
End Class

Module Example
   Public Sub Main()
      Dim firstAuto As New Automobile()
      Console.WriteLine(firstAuto)
   End Sub
End Module
' The example displays the following output:
'       Automobile

Предупреждение

Начиная с Windows 8.1 среда выполнения Windows включает интерфейс IStringable с единственным методом IStringable.ToString, который обеспечивает поддержку форматирования по умолчанию.Starting with Windows 8.1, the Windows Runtime includes an IStringable interface with a single method, IStringable.ToString, which provides default formatting support. Однако рекомендуется, чтобы управляемые типы не реализовывали интерфейс IStringable .However, we recommend that managed types do not implement the IStringable interface. Дополнительные сведения см. в подразделе "Среда выполнения Windows и интерфейс IStringable" справочных сведений о методе Object.ToString.For more information, see "The Windows Runtime and the IStringable Interface" section on the Object.ToString reference page.

Поскольку производными от Objectявляются все типы, кроме интерфейсов, данная функциональность автоматически присутствует в пользовательских классах и структурах.Because all types other than interfaces are derived from Object, this functionality is automatically provided to your custom classes or structures. Тем не менее функциональные возможности, предлагаемые по умолчанию методом ToString, ограничены: хотя он определяет тип, он не предоставляет никакой информации о экземпляра типа.However, the functionality offered by the default ToString method, is limited: Although it identifies the type, it fails to provide any information about an instance of the type. Для формирования строкового представления объекта, позволяющего получить сведения о конкретном объекте, следует переопределить метод ToString .To provide a string representation of an object that provides information about that object, you must override the ToString method.

Примечание

Структуры наследуют от типа ValueType, который также является наследником Object.Structures inherit from ValueType, which in turn is derived from Object. Хотя в ValueType метод Object.ToStringпереопределен, его реализация идентична базовой.Although ValueType overrides Object.ToString, its implementation is identical.

Переопределение метода ToStringOverride the ToString method

Отображение имени типа зачастую малополезно и не позволяет пользователям типов отличить один экземпляр от другого.Displaying the name of a type is often of limited use and does not allow consumers of your types to differentiate one instance from another. Однако метод ToString можно переопределить, чтобы он мог возвращать более функциональное представление значения объекта.However, you can override the ToString method to provide a more useful representation of an object’s value. В следующем примере определяется объект Temperature , метод ToString которого переопределен и отображает температуру в градусах Цельсия.The following example defines a Temperature object and overrides its ToString method to display the temperature in degrees Celsius.

using System;

public class Temperature
{
   private decimal temp;
   
   public Temperature(decimal temperature)
   {
      this.temp = temperature;   
   }

   public override string ToString()
   {
      return this.temp.ToString("N1") + "°C";
   }
}

public class Example
{
   public static void Main()
   {
      Temperature currentTemperature = new Temperature(23.6m);
      Console.WriteLine("The current temperature is " +
                        currentTemperature.ToString());
   }
}
// The example displays the following output:
//       The current temperature is 23.6°C.
Public Class Temperature
   Private temp As Decimal
   
   Public Sub New(temperature As Decimal)
      Me.temp = temperature
   End Sub
   
   Public Overrides Function ToString() As String
      Return Me.temp.ToString("N1") + "°C"   
   End Function
End Class

Module Example
   Public Sub Main()
      Dim currentTemperature As New Temperature(23.6d)
      Console.WriteLine("The current temperature is " +
                        currentTemperature.ToString())
   End Sub
End Module
' The example displays the following output:
'       The current temperature is 23.6°C.

В .NET метод ToString переопределен для всех типов-примитивов значений: вместо имени он отображает значение объекта.In .NET, the ToString method of each primitive value type has been overridden to display the object’s value instead of its name. В следующей таблице показаны переопределения для всех типов-примитивов.The following table shows the override for each primitive type. Обратите внимание, что большинство переопределенных методов вызывают другую перегрузку метода ToString и передают ей описатель формата "G", который задает общий формат типа, и объект IFormatProvider , представляющий текущий язык и региональные параметры.Note that most of the overridden methods call another overload of the ToString method and pass it the "G" format specifier, which defines the general format for its type, and an IFormatProvider object that represents the current culture.

ТипType Переопределение ToStringToString override
Boolean Возвращает Boolean.TrueString или Boolean.FalseString.Returns either Boolean.TrueString or Boolean.FalseString.
Byte Вызывает метод Byte.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение Byte в соответствии с текущим языком и региональными параметрами.Calls Byte.ToString("G", NumberFormatInfo.CurrentInfo) to format the Byte value for the current culture.
Char Возвращает символ в виде строки.Returns the character as a string.
DateTime Вызывает метод DateTime.ToString("G", DatetimeFormatInfo.CurrentInfo) , чтобы отформатировать значение даты и времени в соответствии с текущим языком и региональными параметрами.Calls DateTime.ToString("G", DatetimeFormatInfo.CurrentInfo) to format the date and time value for the current culture.
Decimal Вызывает метод Decimal.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение Decimal в соответствии с текущим языком и региональными параметрами.Calls Decimal.ToString("G", NumberFormatInfo.CurrentInfo) to format the Decimal value for the current culture.
Double Вызывает метод Double.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение Double в соответствии с текущим языком и региональными параметрами.Calls Double.ToString("G", NumberFormatInfo.CurrentInfo) to format the Double value for the current culture.
Int16 Вызывает метод Int16.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение Int16 в соответствии с текущим языком и региональными параметрами.Calls Int16.ToString("G", NumberFormatInfo.CurrentInfo) to format the Int16 value for the current culture.
Int32 Вызывает метод Int32.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение Int32 в соответствии с текущим языком и региональными параметрами.Calls Int32.ToString("G", NumberFormatInfo.CurrentInfo) to format the Int32 value for the current culture.
Int64 Вызывает метод Int64.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение Int64 в соответствии с текущим языком и региональными параметрами.Calls Int64.ToString("G", NumberFormatInfo.CurrentInfo) to format the Int64 value for the current culture.
SByte Вызывает метод SByte.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение SByte в соответствии с текущим языком и региональными параметрами.Calls SByte.ToString("G", NumberFormatInfo.CurrentInfo) to format the SByte value for the current culture.
Single Вызывает метод Single.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение Single в соответствии с текущим языком и региональными параметрами.Calls Single.ToString("G", NumberFormatInfo.CurrentInfo) to format the Single value for the current culture.
UInt16 Вызывает метод UInt16.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение UInt16 в соответствии с текущим языком и региональными параметрами.Calls UInt16.ToString("G", NumberFormatInfo.CurrentInfo) to format the UInt16 value for the current culture.
UInt32 Вызывает метод UInt32.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение UInt32 в соответствии с текущим языком и региональными параметрами.Calls UInt32.ToString("G", NumberFormatInfo.CurrentInfo) to format the UInt32 value for the current culture.
UInt64 Вызывает метод UInt64.ToString("G", NumberFormatInfo.CurrentInfo) , чтобы отформатировать значение UInt64 в соответствии с текущим языком и региональными параметрами.Calls UInt64.ToString("G", NumberFormatInfo.CurrentInfo) to format the UInt64 value for the current culture.

Метод ToString и строки форматаThe ToString method and format strings

Использовать метод ToString по умолчанию или перегрузку ToString удобно, если у объекта имеется однозначное строковое представление.Relying on the default ToString method or overriding ToString is appropriate when an object has a single string representation. Тем не менее зачастую значение объекта может иметь несколько представлений.However, the value of an object often has multiple representations. Например, температура может выражаться в градусах по шкале Фаренгейта, Цельсия или Кельвина.For example, a temperature can be expressed in degrees Fahrenheit, degrees Celsius, or kelvins. Аналогично, целое число 10 можно представить различными способами, включая 10, 10.0, 1.0e01 или $10.00.Similarly, the integer value 10 can be represented in numerous ways, including 10, 10.0, 1.0e01, or $10.00.

Для реализации нескольких строковых представлений одного значения в платформе .NET используются строки формата.To enable a single value to have multiple string representations, .NET uses format strings. Строка формата содержит один или несколько предопределенных описателей формата, представляющих собой одиночные символы или группы символов, указывающие, как метод ToString должен форматировать вывод.A format string is a string that contains one or more predefined format specifiers, which are single characters or groups of characters that define how the ToString method should format its output. Строка формата передается в качестве параметра методу ToString объекта и определяет, как должно выглядеть строковое представление его значения.The format string is then passed as a parameter to the object's ToString method and determines how the string representation of that object's value should appear.

Все числовые типы, типы даты и времени, а также перечисления в составе платформы .NET поддерживают предопределенный набор описателей формата.All numeric types, date and time types, and enumeration types in .NET support a predefined set of format specifiers. Строки формата также можно использовать для определения разнообразных строковых представлений прикладных пользовательских типов данных.You can also use format strings to define multiple string representations of your application-defined data types.

Строки стандартного форматаStandard format strings

Строка стандартного формата содержит один описатель формата. Это алфавитный символ, определяющий строковое представление объекта, к которому он применяется. Также строка формата может содержать необязательный описатель точности, определяющий, сколько цифр отображается в результирующей строке.A standard format string contains a single format specifier, which is an alphabetic character that defines the string representation of the object to which it is applied, along with an optional precision specifier that affects how many digits are displayed in the result string. Если описатель точности не указан или не поддерживается, описатель стандартного формата будет эквивалентен строке стандартного формата.If the precision specifier is omitted or is not supported, a standard format specifier is equivalent to a standard format string.

В платформе .NET определяется набор описателей стандартного формата для всех числовых типов, типов даты и времени, а также для всех типов перечислений..NET defines a set of standard format specifiers for all numeric types, all date and time types, and all enumeration types. Например, все эти категории поддерживают описатель стандартного формата "G", который определяет общее строковое представление значения соответствующего типа.For example, each of these categories supports a "G" standard format specifier, which defines a general string representation of a value of that type.

Строки стандартного формата для типов перечислений напрямую определяют строковое представление значения.Standard format strings for enumeration types directly control the string representation of a value. От строки формата, переданной в метод ToString значения перечисления, зависит, будет оно представлено своим строковым именем (описатели формата "G" и "F"), базовым целочисленным значением (описатель формата "D") или шестидесятеричным значением (описатель формата "X").The format strings passed to an enumeration value’s ToString method determine whether the value is displayed using its string name (the "G" and "F" format specifiers), its underlying integral value (the "D" format specifier), or its hexadecimal value (the "X" format specifier). В следующем примере демонстрируется использование строк стандартного формата для форматирования значения перечисления DayOfWeek .The following example illustrates the use of standard format strings to format a DayOfWeek enumeration value.

DayOfWeek thisDay = DayOfWeek.Monday;
string[] formatStrings = {"G", "F", "D", "X"};

foreach (string formatString in formatStrings)
   Console.WriteLine(thisDay.ToString(formatString));
// The example displays the following output:
//       Monday
//       Monday
//       1
//       00000001
Dim thisDay As DayOfWeek = DayOfWeek.Monday
Dim formatStrings() As String = {"G", "F", "D", "X"}

For Each formatString As String In formatStrings
   Console.WriteLine(thisDay.ToString(formatString))
Next
' The example displays the following output:
'       Monday
'       Monday
'       1
'       00000001

Сведения о строках форматов перечислений см. в разделе Enumeration Format Strings.For information about enumeration format strings, see Enumeration Format Strings.

Строки стандартного формата для числовых типов обычно задают результирующую строку, точный вид которой зависит от значения одного или нескольких свойств.Standard format strings for numeric types usually define a result string whose precise appearance is controlled by one or more property values. Например, описатель формата "C" форматирует число в виде значения валюты.For example, the "C" format specifier formats a number as a currency value. При вызове метода ToString с описателем формата "C" в качестве единственного параметра для определения строкового представления числового значения используются следующие свойства объекта NumberFormatInfo для текущего языка и региональных параметров:When you call the ToString method with the "C" format specifier as the only parameter, the following property values from the current culture’s NumberFormatInfo object are used to define the string representation of the numeric value:

  • Свойство CurrencySymbol , определяющее символ валюты для текущего языка и региональных параметров.The CurrencySymbol property, which specifies the current culture’s currency symbol.

  • Свойство CurrencyNegativePattern или CurrencyPositivePattern , возвращающее целое число, от которого зависит следующее:The CurrencyNegativePattern or CurrencyPositivePattern property, which returns an integer that determines the following:

    • Положение символа валюты.The placement of the currency symbol.

    • Обозначение отрицательных значений: отрицательный знак в начале, отрицательный знак в конце или круглые скобки.Whether negative values are indicated by a leading negative sign, a trailing negative sign, or parentheses.

    • Наличие пробела между числовым значением и символом валюты.Whether a space appears between the numeric value and the currency symbol.

  • Свойство CurrencyDecimalDigits , определяющее число цифр дробной части в результирующей строке.The CurrencyDecimalDigits property, which defines the number of fractional digits in the result string.

  • Свойство CurrencyDecimalSeparator , определяющее символ-разделитель целой и дробной частей в результирующей строке.The CurrencyDecimalSeparator property, which defines the decimal separator symbol in the result string.

  • Свойство CurrencyGroupSeparator , определяющее символ-разделитель групп.The CurrencyGroupSeparator property, which defines the group separator symbol.

  • Свойство CurrencyGroupSizes , определяющее число цифр в каждой из групп слева от разделителя целой и дробной частей.The CurrencyGroupSizes property, which defines the number of digits in each group to the left of the decimal.

  • Свойство NegativeSign , задающее отрицательный знак, который используется в случаях, если скобки не применяются для обозначения отрицательных значений в результирующей строке.The NegativeSign property, which determines the negative sign used in the result string if parentheses are not used to indicate negative values.

Кроме того, строки числового формата могут содержать описатель точности.In addition, numeric format strings may include a precision specifier. Смысл этого описателя зависит от строки формата, в которой он используется, но обычно он задает общее число цифр в результирующей строке или число цифр в дробной части.The meaning of this specifier depends on the format string with which it is used, but it typically indicates either the total number of digits or the number of fractional digits that should appear in the result string. В следующем примере используется строка стандартного числового формата с описателем точности ("X4"), что позволяет сформировать строковое значение из четырех шестидесятеричных цифр.For example, the following example uses the "X4" standard numeric string and a precision specifier to create a string value that has four hexadecimal digits.

byte[] byteValues = { 12, 163, 255 };
foreach (byte byteValue in byteValues)
   Console.WriteLine(byteValue.ToString("X4"));
// The example displays the following output:
//       000C
//       00A3
//       00FF
Dim byteValues() As Byte = { 12, 163, 255 }
For Each byteValue As Byte In byteValues
   Console.WriteLine(byteValue.ToString("X4"))
Next
' The example displays the following output:
'       000C
'       00A3
'       00FF

Дополнительные сведения о строках стандартных числовых форматов см. в разделе Standard Numeric Format Strings.For more information about standard numeric formatting strings, see Standard Numeric Format Strings.

Строки стандартного формата для значений даты и времени — это псевдонимы строк настраиваемого формата, которые хранятся в конкретном свойстве DateTimeFormatInfo .Standard format strings for date and time values are aliases for custom format strings stored by a particular DateTimeFormatInfo property. Например, вызов метода ToString применительно к значению даты и времени с описателем формата "D" приведет к отображению даты и времени с помощью настраиваемой строки формата, хранящейся в свойстве DateTimeFormatInfo.LongDatePattern для текущего языка и региональных параметров.For example, calling the ToString method of a date and time value with the "D" format specifier displays the date and time by using the custom format string stored in the current culture’s DateTimeFormatInfo.LongDatePattern property. (Дополнительные сведения о строках настраиваемого формата см. в следующем разделе.) Данная связь показана в следующем примере.(For more information about custom format strings, see the next section.) The following example illustrates this relationship.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      DateTime date1 = new DateTime(2009, 6, 30);
      Console.WriteLine("D Format Specifier:     {0:D}", date1);
      string longPattern = CultureInfo.CurrentCulture.DateTimeFormat.LongDatePattern;
      Console.WriteLine("'{0}' custom format string:     {1}", 
                        longPattern, date1.ToString(longPattern));
   }
}
// The example displays the following output when run on a system whose
// current culture is en-US:
//    D Format Specifier:     Tuesday, June 30, 2009
//    'dddd, MMMM dd, yyyy' custom format string:     Tuesday, June 30, 2009
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim date1 As Date = #6/30/2009#
      Console.WriteLine("D Format Specifier:     {0:D}", date1)
      Dim longPattern As String = CultureInfo.CurrentCulture.DateTimeFormat.LongDatePattern
      Console.WriteLine("'{0}' custom format string:     {1}", _
                        longPattern, date1.ToString(longPattern))
   End Sub
End Module
' The example displays the following output when run on a system whose
' current culture is en-US:
'    D Format Specifier:     Tuesday, June 30, 2009
'    'dddd, MMMM dd, yyyy' custom format string:     Tuesday, June 30, 2009

Дополнительные сведения о строках стандартных форматов даты и времени см. в разделе Standard Date and Time Format Strings.For more information about standard date and time format strings, see Standard Date and Time Format Strings.

Строки стандартного формата также можно использовать для определения строкового представления прикладного объекта, формируемого с помощью метода ToString(String) такого объекта.You can also use standard format strings to define the string representation of an application-defined object that is produced by the object’s ToString(String) method. Можно определить конкретные описатели стандартного формата, поддерживаемые объектом, а также решить, будут ли они зависеть от регистра символов.You can define the specific standard format specifiers that your object supports, and you can determine whether they are case-sensitive or case-insensitive. Реализация метода ToString(String) должна отвечать следующим условиям:Your implementation of the ToString(String) method should support the following:

  • Должен поддерживаться описатель формата "G", отвечающий за представление обычного или общего формата объекта.A "G" format specifier that represents a customary or common format of the object. Перегрузка метода ToString объекта, не имеющая параметров, должна вызывать его перегрузку ToString(String) , передавая ей строку стандартного формата "G".The parameterless overload of your object's ToString method should call its ToString(String) overload and pass it the "G" standard format string.

  • Должен поддерживаться описатель формата, равный пустой ссылке (Nothing в Visual Basic).Support for a format specifier that is equal to a null reference (Nothing in Visual Basic). Описатель формата, равный пустой ссылке, должен рассматриваться как эквивалент описателя формата "G".A format specifier that is equal to a null reference should be considered equivalent to the "G" format specifier.

Например, во внутреннем представлении класса Temperature температура может храниться в градусах Цельсия, а для представления значения объекта Temperature в градусах Цельсия, Фаренгейта или Кельвина могут использоваться различные описатели формата.For example, a Temperature class can internally store the temperature in degrees Celsius and use format specifiers to represent the value of the Temperature object in degrees Celsius, degrees Fahrenheit, and kelvins. Ниже приведен пример.The following example provides an illustration.

using System;

public class Temperature
{
   private decimal m_Temp;
   
   public Temperature(decimal temperature)
   {
      this.m_Temp = temperature;
   }
   
   public decimal Celsius
   {
      get { return this.m_Temp; }
   }
   
   public decimal Kelvin
   {
      get { return this.m_Temp + 273.15m; }   
   }
   
   public decimal Fahrenheit
   {
      get { return Math.Round(((decimal) (this.m_Temp * 9 / 5 + 32)), 2); }
   }

   public override string ToString()
   {
      return this.ToString("C");
   }
   
   public string ToString(string format)
   {  
      // Handle null or empty string.
      if (String.IsNullOrEmpty(format)) format = "C";
      // Remove spaces and convert to uppercase.
      format = format.Trim().ToUpperInvariant();      
      
      // Convert temperature to Fahrenheit and return string.
      switch (format)
      {
         // Convert temperature to Fahrenheit and return string.
         case "F":
            return this.Fahrenheit.ToString("N2") + " °F";
         // Convert temperature to Kelvin and return string.
         case "K":
            return this.Kelvin.ToString("N2") + " K";
         // return temperature in Celsius.
         case "G":
         case "C":
            return this.Celsius.ToString("N2") + " °C";
         default:
            throw new FormatException(String.Format("The '{0}' format string is not supported.", format));
      }      
   }
}

public class Example
{
   public static void Main()
   {
      Temperature temp1 = new Temperature(0m);
      Console.WriteLine(temp1.ToString());
      Console.WriteLine(temp1.ToString("G"));
      Console.WriteLine(temp1.ToString("C"));
      Console.WriteLine(temp1.ToString("F"));
      Console.WriteLine(temp1.ToString("K"));

      Temperature temp2 = new Temperature(-40m);
      Console.WriteLine(temp2.ToString());
      Console.WriteLine(temp2.ToString("G"));
      Console.WriteLine(temp2.ToString("C"));
      Console.WriteLine(temp2.ToString("F"));
      Console.WriteLine(temp2.ToString("K"));

      Temperature temp3 = new Temperature(16m);
      Console.WriteLine(temp3.ToString());
      Console.WriteLine(temp3.ToString("G"));
      Console.WriteLine(temp3.ToString("C"));
      Console.WriteLine(temp3.ToString("F"));
      Console.WriteLine(temp3.ToString("K"));
      
      Console.WriteLine(String.Format("The temperature is now {0:F}.", temp3));
   }
}
// The example displays the following output:
//       0.00 °C
//       0.00 °C
//       0.00 °C
//       32.00 °F
//       273.15 K
//       -40.00 °C
//       -40.00 °C
//       -40.00 °C
//       -40.00 °F
//       233.15 K
//       16.00 °C
//       16.00 °C
//       16.00 °C
//       60.80 °F
//       289.15 K
//       The temperature is now 16.00 °C.
Public Class Temperature
   Private m_Temp As Decimal
   
   Public Sub New(temperature As Decimal)
      Me.m_Temp = temperature
   End Sub
   
   Public ReadOnly Property Celsius() As Decimal
      Get
         Return Me.m_Temp
      End Get   
   End Property
   
   Public ReadOnly Property Kelvin() As Decimal
      Get
         Return Me.m_Temp + 273.15d   
      End Get
   End Property
   
   Public ReadOnly Property Fahrenheit() As Decimal
      Get
         Return Math.Round(CDec(Me.m_Temp * 9 / 5 + 32), 2)
      End Get      
   End Property

   Public Overrides Function ToString() As String
      Return Me.ToString("C")
   End Function
   
   Public Overloads Function ToString(format As String) As String  
      ' Handle null or empty string.
      If String.IsNullOrEmpty(format) Then format = "C"
      ' Remove spaces and convert to uppercase.
      format = format.Trim().ToUpperInvariant()      
      
      Select Case format
         Case "F"
           ' Convert temperature to Fahrenheit and return string.
            Return Me.Fahrenheit.ToString("N2") & " °F"
         Case "K"
            ' Convert temperature to Kelvin and return string.
            Return Me.Kelvin.ToString("N2") & " K"
         Case "C", "G"
            ' Return temperature in Celsius.
            Return Me.Celsius.ToString("N2") & " °C"
         Case Else
            Throw New FormatException(String.Format("The '{0}' format string is not supported.", format))
      End Select      
   End Function
End Class

Public Module Example
   Public Sub Main()
      Dim temp1 As New Temperature(0d)
      Console.WriteLine(temp1.ToString())
      Console.WriteLine(temp1.ToString("G"))
      Console.WriteLine(temp1.ToString("C"))
      Console.WriteLine(temp1.ToString("F"))
      Console.WriteLine(temp1.ToString("K"))

      Dim temp2 As New Temperature(-40d)
      Console.WriteLine(temp2.ToString())
      Console.WriteLine(temp2.ToString("G"))
      Console.WriteLine(temp2.ToString("C"))
      Console.WriteLine(temp2.ToString("F"))
      Console.WriteLine(temp2.ToString("K"))

      Dim temp3 As New Temperature(16d)
      Console.WriteLine(temp3.ToString())
      Console.WriteLine(temp3.ToString("G"))
      Console.WriteLine(temp3.ToString("C"))
      Console.WriteLine(temp3.ToString("F"))
      Console.WriteLine(temp3.ToString("K"))
      
      Console.WriteLine(String.Format("The temperature is now {0:F}.", temp3))
   End Sub
End Module
' The example displays the following output:
'       0.00 °C
'       0.00 °C
'       0.00 °C
'       32.00 °F
'       273.15 K
'       -40.00 °C
'       -40.00 °C
'       -40.00 °C
'       -40.00 °F
'       233.15 K
'       16.00 °C
'       16.00 °C
'       16.00 °C
'       60.80 °F
'       289.15 K
'       The temperature is now 16.00 °C.

Строки настраиваемого форматаCustom format strings

Помимо строк стандартного формата, в платформе .NET для числовых значений и значений даты и времени определяются строки настраиваемого формата.In addition to the standard format strings, .NET defines custom format strings for both numeric values and date and time values. Строка настраиваемого формата состоит из одного или нескольких описателей настраиваемого формата, описывающих строковое представление значения.A custom format string consists of one or more custom format specifiers that define the string representation of a value. Например, строка настраиваемого формата даты и времени, заданная как "yyyy/mm/dd hh:mm:ss.ffff t zzz", преобразует дату в строковое представления вида "2008/11/15 07:45:00.0000 P -08:00" для языка и региональных параметров "en-US".For example, the custom date and time format string "yyyy/mm/dd hh:mm:ss.ffff t zzz" converts a date to its string representation in the form "2008/11/15 07:45:00.0000 P -08:00" for the en-US culture. Аналогично строка настраиваемого формата "0000" приведет к преобразованию целочисленного значения 12 в строку "0012".Similarly, the custom format string "0000" converts the integer value 12 to "0012". Полный список строк настраиваемого формата см. в разделах Custom Date and Time Format Strings и Custom Numeric Format Strings.For a complete list of custom format strings, see Custom Date and Time Format Strings and Custom Numeric Format Strings.

Если строка формата состоит из одного описателя настраиваемого формата, то перед ним должен стоять символ процента (%), чтобы его можно было отличить от описателя стандартного формата.If a format string consists of a single custom format specifier, the format specifier should be preceded by the percent (%) symbol to avoid confusion with a standard format specifier. В следующем примере описатель настраиваемого формата "М" используется для вывода одно- или двухзначного числа месяца для определенной даты.The following example uses the "M" custom format specifier to display a one-digit or two-digit number of the month of a particular date.

DateTime date1 = new DateTime(2009, 9, 8);
Console.WriteLine(date1.ToString("%M"));       // Displays 9
Dim date1 As Date = #09/08/2009#
Console.WriteLine(date1.ToString("%M"))      ' Displays 9

Многие строки стандартного формата для значений даты и времени являются псевдонимами для строк настраиваемого формата, определяемых свойствами объекта DateTimeFormatInfo .Many standard format strings for date and time values are aliases for custom format strings that are defined by properties of the DateTimeFormatInfo object. Строки настраиваемого формата также позволяют добиться значительной гибкости в реализации прикладного форматирования числовых значений или значений даты и времени.Custom format strings also offer considerable flexibility in providing application-defined formatting for numeric values or date and time values. Можно определить собственные настраиваемые результирующие строки для числовых значений и значений даты и времени, объединив несколько описателей настраиваемого формата в одной строке настраиваемого формата.You can define your own custom result strings for both numeric values and date and time values by combining multiple custom format specifiers into a single custom format string. В следующем примере определяется строка настраиваемого формата, отображающая день недели в скобках после названия месяца, числа и года.The following example defines a custom format string that displays the day of the week in parentheses after the month name, day, and year.

string customFormat = "MMMM dd, yyyy (dddd)";
DateTime date1 = new DateTime(2009, 8, 28);
Console.WriteLine(date1.ToString(customFormat));   
// The example displays the following output if run on a system
// whose language is English:
//       August 28, 2009 (Friday)      
Dim customFormat As String = "MMMM dd, yyyy (dddd)"
Dim date1 As Date = #8/28/2009#
Console.WriteLine(date1.ToString(customFormat))   
' The example displays the following output if run on a system
' whose language is English:
'       August 28, 2009 (Friday)      

В следующем примере определяется строка настраиваемого формата, которая отображает значение Int64 как стандартный 7-значный американский номер телефона вместе с кодом города.The following example defines a custom format string that displays an Int64 value as a standard, seven-digit U.S. telephone number along with its area code.

using System;

public class Example
{
   public static void Main()
   {
      long number = 8009999999;
      string fmt = "000-000-0000";
      Console.WriteLine(number.ToString(fmt));
   }
}
// The example displays the following output:
//        800-999-9999
Module Example
   Public Sub Main()
      Dim number As Long = 8009999999
      Dim fmt As String = "000-000-0000"
      Console.WriteLine(number.ToString(fmt))
   End Sub
End Module
' The example displays the following output:

' The example displays the following output:
'       800-999-9999

Хотя строк стандартного формата обычно достаточно для выполнения большинства задач форматирования прикладных типов, для форматирования пользовательских типов также можно определять описатели настраиваемого формата.Although standard format strings can generally handle most of the formatting needs for your application-defined types, you may also define custom format specifiers to format your types.

Строки форматов и типы .NETFormat strings and .NET types

Все числовые типы (то есть типы Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64 и BigInteger), а также DateTime, DateTimeOffset, TimeSpan, Guid и все типы перечислений поддерживают форматирование с помощью строк форматов.All numeric types (that is, the Byte, Decimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32, UInt64, and BigInteger types), as well as the DateTime, DateTimeOffset, TimeSpan, Guid, and all enumeration types, support formatting with format strings. Сведения о конкретных строках форматов, поддерживаемых каждым типом, см. в следующих разделах.For information on the specific format strings supported by each type, see the following topics:

ЗаголовокTitle ОпределениеDefinition
Standard Numeric Format StringsStandard Numeric Format Strings Описание строк стандартного формата, позволяющих создавать общеупотребимые строковые представления числовых значений.Describes standard format strings that create commonly used string representations of numeric values.
Custom Numeric Format StringsCustom Numeric Format Strings Описание строк настраиваемого формата, позволяющих создавать прикладные строковые представления числовых значений.Describes custom format strings that create application-specific formats for numeric values.
Строки стандартных форматов даты и времениStandard Date and Time Format Strings Описание строк стандартного формата, позволяющих создавать общеупотребимые строковые представления значений DateTime и DateTimeOffset.Describes standard format strings that create commonly used string representations of DateTime and DateTimeOffset values.
Строки настраиваемых форматов даты и времениCustom Date and Time Format Strings Описание строк настраиваемого формата, позволяющих создавать прикладные строковые представления значений DateTime и DateTimeOffset.Describes custom format strings that create application-specific formats for DateTime and DateTimeOffset values.
Строки стандартного формата TimeSpanStandard TimeSpan Format Strings Описание строк стандартного формата, позволяющих создавать общеупотребимые строковые представления интервалов времени.Describes standard format strings that create commonly used string representations of time intervals.
Строки настраиваемого формата TimeSpanCustom TimeSpan Format Strings Описание строк настраиваемого формата, позволяющих создавать прикладные строковые представления интервалов времени.Describes custom format strings that create application-specific formats for time intervals.
Enumeration Format StringsEnumeration Format Strings Описание строк стандартного формата, используемых для создания строковых представлений значений перечислений.Describes standard format strings that are used to create string representations of enumeration values.
Guid.ToString(String) Описание строк стандартного формата для значений Guid .Describes standard format strings for Guid values.

Форматирование с учетом языка и региональных параметров с помощью поставщиков форматаCulture-sensitive formatting with format providers

Хотя описатели формата позволяют настраивать форматирование объектов, для формирования осмысленного строкового представления объектов зачастую требуется дополнительная информация, связанная с форматированием.Although format specifiers let you customize the formatting of objects, producing a meaningful string representation of objects often requires additional formatting information. Например, при форматировании числового значения в формате валюты с помощью строки стандартного формата "C" или строки настраиваемого формата "$ #,#.00" для включения в отформатированную строку должен быть известен нужный символ валюты, разделитель групп, а также разделитель целой и дробной частей.For example, formatting a number as a currency value by using either the "C" standard format string or a custom format string such as "$ #,#.00" requires, at a minimum, information about the correct currency symbol, group separator, and decimal separator to be available to include in the formatted string. В .NET эти дополнительные сведения предоставляются с помощью интерфейса IFormatProvider, который передается в качестве параметра одной или нескольким перегрузкам метода ToString для числовых типов и типов даты и времени.In .NET, this additional formatting information is made available through the IFormatProvider interface, which is provided as a parameter to one or more overloads of the ToString method of numeric types and date and time types. Реализации IFormatProvider используются в .NET для поддержки форматирования с учетом языка и региональных параметров.IFormatProvider implementations are used in .NET to support culture-specific formatting. В следующем примере показано, как меняется строковое представление объекта при его форматировании с использованием трех разных объектов IFormatProvider .The following example illustrates how the string representation of an object changes when it is formatted with three IFormatProvider objects that represent different cultures.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      decimal value = 1603.42m;
      Console.WriteLine(value.ToString("C3", new CultureInfo("en-US")));
      Console.WriteLine(value.ToString("C3", new CultureInfo("fr-FR")));
      Console.WriteLine(value.ToString("C3", new CultureInfo("de-DE")));
   }
}
// The example displays the following output:
//       $1,603.420
//       1 603,420 €
//       1.603,420 €
Imports System.Globalization

Public Module Example
   Public Sub Main()
      Dim value As Decimal = 1603.42d
      Console.WriteLine(value.ToString("C3", New CultureInfo("en-US")))
      Console.WriteLine(value.ToString("C3", New CultureInfo("fr-FR")))
      Console.WriteLine(value.ToString("C3", New CultureInfo("de-DE")))
   End Sub
End Module
' The example displays the following output:
'       $1,603.420
'       1 603,420 €
'       1.603,420 €

Интерфейс IFormatProvider включает один метод, GetFormat(Type), имеющий один параметр, задающий тип объекта, предоставляющего сведения о форматировании.The IFormatProvider interface includes one method, GetFormat(Type), which has a single parameter that specifies the type of object that provides formatting information. Если метод может предоставить объект указанного типа, то он его возвращает.If the method can provide an object of that type, it returns it. В противном случае метод возвратит пустую ссылку (Nothing в Visual Basic).Otherwise, it returns a null reference (Nothing in Visual Basic).

МетодIFormatProvider.GetFormat является методом обратного вызова.IFormatProvider.GetFormat is a callback method. При вызове перегрузки метода ToString , имеющей параметр IFormatProvider , вызывается метод GetFormat соответствующего объекта IFormatProvider .When you call a ToString method overload that includes an IFormatProvider parameter, it calls the GetFormat method of that IFormatProvider object. Метод GetFormat должен вернуть в метод formatType объект, способный предоставить необходимые сведения о форматировании и соответствующий параметру ToString .The GetFormat method is responsible for returning an object that provides the necessary formatting information, as specified by its formatType parameter, to the ToString method.

Многие методы форматирования и преобразования строк имеют параметр типа IFormatProvider, но во многих случаях значение параметра игнорируется при вызове метода.A number of formatting or string conversion methods include a parameter of type IFormatProvider, but in many cases the value of the parameter is ignored when the method is called. В следующей таблице перечислены некоторые методы форматирования, использующие этот параметр. Для каждого метода также указывается тип объекта Type , передаваемого в метод IFormatProvider.GetFormat .The following table lists some of the formatting methods that use the parameter and the type of the Type object that they pass to the IFormatProvider.GetFormat method.

МетодMethod Тип параметра formatTypeType of formatType parameter
МетодToString для числовых типовToString method of numeric types System.Globalization.NumberFormatInfo
Метод ToString для типов даты и времениToString method of date and time types System.Globalization.DateTimeFormatInfo
String.Format System.ICustomFormatter
StringBuilder.AppendFormat System.ICustomFormatter

Примечание

Методы ToString у числовых типов и типов даты и времени перегружены; параметр IFormatProvider имеется лишь у некоторых перегрузок.The ToString methods of the numeric types and date and time types are overloaded, and only some of the overloads include an IFormatProvider parameter. Если у метода нет параметра типа IFormatProvider, то вместо этого передается объект, возвращаемый свойством CultureInfo.CurrentCulture .If a method does not have a parameter of type IFormatProvider, the object that is returned by the CultureInfo.CurrentCulture property is passed instead. Например, вызов метода Int32.ToString() по умолчанию в итоге приведет к подобному вызову метода: Int32.ToString("G", System.Globalization.CultureInfo.CurrentCulture).For example, a call to the default Int32.ToString() method ultimately results in a method call such as the following: Int32.ToString("G", System.Globalization.CultureInfo.CurrentCulture).

.NET предоставляет следующие три класса, реализующие интерфейс IFormatProvider..NET provides three classes that implement IFormatProvider:

  • DateTimeFormatInfo: класс, предоставляющий сведения о форматировании значений даты и времени для конкретного языка и региональных параметров.DateTimeFormatInfo, a class that provides formatting information for date and time values for a specific culture. Реализация метода IFormatProvider.GetFormat в этом классе возвращает его экземпляр.Its IFormatProvider.GetFormat implementation returns an instance of itself.

  • NumberFormatInfo: класс, предоставляющий сведения о форматировании числовых значений для конкретного языка и региональных параметров.NumberFormatInfo, a class that provides numeric formatting information for a specific culture. Реализация метода IFormatProvider.GetFormat в этом классе возвращает его экземпляр.Its IFormatProvider.GetFormat implementation returns an instance of itself.

  • CultureInfo.CultureInfo. Реализация метода IFormatProvider.GetFormat в этом классе возвращает объект NumberFormatInfo , предоставляющий сведения о форматировании числовых значений, либо объект DateTimeFormatInfo , предоставляющий сведения о форматировании значений даты и времени.Its IFormatProvider.GetFormat implementation can return either a NumberFormatInfo object to provide numeric formatting information or a DateTimeFormatInfo object to provide formatting information for date and time values.

Также можно реализовать пользовательский поставщик форматирования, позволяющий заменить любой из этих классов.You can also implement your own format provider to replace any one of these classes. При этом пользовательская реализация метода GetFormat, рассчитанная на предоставление сведений о форматировании для метода ToString, должна возвращать объект одного из типов, перечисленных в приведенной выше таблице.However, your implementation’s GetFormat method must return an object of the type listed in the previous table if it has to provide formatting information to the ToString method.

Форматирование числовых значений, зависящее от языка и региональных параметровCulture-sensitive formatting of numeric values

По умолчанию форматирование числовых значений зависит от языка и региональных параметров.By default, the formatting of numeric values is culture-sensitive. Если не указать язык и региональные параметры при вызове метода форматирования, используются соглашения о форматировании текущего языка и региональных параметров.If you do not specify a culture when you call a formatting method, the formatting conventions of the current thread culture are used. Это продемонстрировано в следующем примере, который изменяет текущие язык и региональные параметры четыре раза, а затем вызывает метод Decimal.ToString(String) .This is illustrated in the following example, which changes the current thread culture four times and then calls the Decimal.ToString(String) method. В каждом случае результирующая строка отражает соглашения о форматировании текущих языка и региональных параметров.In each case, the result string reflects the formatting conventions of the current culture. Это происходит потому, что методы ToString и ToString(String) создают оболочки для вызовов метода ToString(String, IFormatProvider) каждого числового типа.This is because the ToString and ToString(String) methods wrap calls to each numeric type's ToString(String, IFormatProvider) method.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "fr-FR", "es-MX", "de-DE" };
      Decimal value = 1043.17m;
      
      foreach (var cultureName in cultureNames) {
         // Change the current thread culture.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
         Console.WriteLine("The current culture is {0}", 
                           Thread.CurrentThread.CurrentCulture.Name);
         Console.WriteLine(value.ToString("C2"));
         Console.WriteLine();
      }   
   }
}
// The example displays the following output:
//       The current culture is en-US
//       $1,043.17
//       
//       The current culture is fr-FR
//       1 043,17 €
//       
//       The current culture is es-MX
//       $1,043.17
//       
//       The current culture is de-DE
//       1.043,17 €
Imports System.Globalization
Imports System.Threading 

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "es-MX", "de-DE" }
      Dim value As Decimal = 1043.17d 
      
      For Each cultureName In cultureNames
         ' Change the current thread culture.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current culture is {0}", 
                           Thread.CurrentThread.CurrentCulture.Name)
         Console.WriteLine(value.ToString("C2"))
         Console.WriteLine()
      Next                  
   End Sub
End Module
' The example displays the following output:
'       The current culture is en-US
'       $1,043.17
'       
'       The current culture is fr-FR
'       1 043,17 €
'       
'       The current culture is es-MX
'       $1,043.17
'       
'       The current culture is de-DE
'       1.043,17 €

Отформатировать числовое значение для определенных языка и региональных параметров также можно путем вызова перегрузки метода ToString , которая имеет параметр provider , и передачи ей одного из следующих объектов:You can also format a numeric value for a specific culture by calling a ToString overload that has a provider parameter and passing it either of the following:

  • объекта CultureInfo , представляющего язык и региональные параметры, соглашения о форматировании которых требуется использовать.A CultureInfo object that represents the culture whose formatting conventions are to be used. Его метод CultureInfo.GetFormat возвращает значение свойства CultureInfo.NumberFormat , которое является объектом NumberFormatInfo , предоставляющим сведения о форматировании в соответствии с языком и региональными параметрами для числовых значений;Its CultureInfo.GetFormat method returns the value of the CultureInfo.NumberFormat property, which is the NumberFormatInfo object that provides culture-specific formatting information for numeric values.

  • объекта NumberFormatInfo , определяющего соглашения о форматировании для используемых языка и региональных параметров.A NumberFormatInfo object that defines the culture-specific formatting conventions to be used. Метод GetFormat этого класса возвращает экземпляр его самого.Its GetFormat method returns an instance of itself.

В следующем примере объекты NumberFormatInfo , представляющие "Английский (США)" и "Английский (Соединенное Королевство)" язык и региональные параметры, а также "Французский" и "Русский" нейтральные языки и региональные параметры, используются для форматирования числа с плавающей запятой.The following example uses NumberFormatInfo objects that represent the English (United States) and English (Great Britain) cultures and the French and Russian neutral cultures to format a floating-point number.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {                                                                                                    
      Double value = 1043.62957;
      string[] cultureNames = { "en-US", "en-GB", "ru", "fr" };
      
      foreach (var name in cultureNames) {
         NumberFormatInfo nfi = CultureInfo.CreateSpecificCulture(name).NumberFormat;
         Console.WriteLine("{0,-6} {1}", name + ":", value.ToString("N3", nfi));
      }   
   }
}
// The example displays the following output:
//       en-US: 1,043.630
//       en-GB: 1,043.630
//       ru:    1 043,630
//       fr:    1 043,630
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim value As Double = 1043.62957
      Dim cultureNames() As String = { "en-US", "en-GB", "ru", "fr" }
      
      For Each name In cultureNames
         Dim nfi As NumberFormatInfo = CultureInfo.CreateSpecificCulture(name).NumberFormat
         Console.WriteLine("{0,-6} {1}", name + ":", value.ToString("N3", nfi))
      Next   
   End Sub
End Module
' The example displays the following output:
'       en-US: 1,043.630
'       en-GB: 1,043.630
'       ru:    1 043,630
'       fr:    1 043,630

Форматирование значений даты и времени, зависящее от языка и региональных параметровCulture-sensitive formatting of date and time values

По умолчанию форматирование значений даты и времени зависит от языка и региональных параметров.By default, the formatting of date and time values is culture-sensitive. Если не указать язык и региональные параметры при вызове метода форматирования, используются соглашения о форматировании текущего языка и региональных параметров.If you do not specify a culture when you call a formatting method, the formatting conventions of the current thread culture are used. Это продемонстрировано в следующем примере, который изменяет текущие язык и региональные параметры четыре раза, а затем вызывает метод DateTime.ToString(String) .This is illustrated in the following example, which changes the current thread culture four times and then calls the DateTime.ToString(String) method. В каждом случае результирующая строка отражает соглашения о форматировании текущих языка и региональных параметров.In each case, the result string reflects the formatting conventions of the current culture. Это происходит потому, что методы DateTime.ToString(), DateTime.ToString(String), DateTimeOffset.ToString()и DateTimeOffset.ToString(String) создают оболочки для вызовов методов DateTime.ToString(String, IFormatProvider) и DateTimeOffset.ToString(String, IFormatProvider) .This is because the DateTime.ToString(), DateTime.ToString(String), DateTimeOffset.ToString(), and DateTimeOffset.ToString(String) methods wrap calls to the DateTime.ToString(String, IFormatProvider) and DateTimeOffset.ToString(String, IFormatProvider) methods.

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "fr-FR", "es-MX", "de-DE" };
      DateTime dateToFormat = new DateTime(2012, 5, 28, 11, 30, 0);
      
      foreach (var cultureName in cultureNames) {
         // Change the current thread culture.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
         Console.WriteLine("The current culture is {0}", 
                           Thread.CurrentThread.CurrentCulture.Name);
         Console.WriteLine(dateToFormat.ToString("F"));
         Console.WriteLine();
      }   
   }
}
// The example displays the following output:
//       The current culture is en-US
//       Monday, May 28, 2012 11:30:00 AM
//       
//       The current culture is fr-FR
//       lundi 28 mai 2012 11:30:00
//       
//       The current culture is es-MX
//       lunes, 28 de mayo de 2012 11:30:00 a.m.
//       
//       The current culture is de-DE
//       Montag, 28. Mai 2012 11:30:00
Imports System.Globalization
Imports System.Threading 

Module Example
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "es-MX", "de-DE" }
      Dim dateToFormat As Date = #5/28/2012 11:30AM#
      
      For Each cultureName In cultureNames
         ' Change the current thread culture.
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current culture is {0}", 
                           Thread.CurrentThread.CurrentCulture.Name)
         Console.WriteLine(dateToFormat.ToString("F"))
         Console.WriteLine()
      Next                  
   End Sub
End Module
' The example displays the following output:
'       The current culture is en-US
'       Monday, May 28, 2012 11:30:00 AM
'       
'       The current culture is fr-FR
'       lundi 28 mai 2012 11:30:00
'       
'       The current culture is es-MX
'       lunes, 28 de mayo de 2012 11:30:00 a.m.
'       
'       The current culture is de-DE
'       Montag, 28. Mai 2012 11:30:00 

Форматировать значения даты и времени для определенных языка и региональных параметров также можно путем вызова перегрузки методов DateTime.ToString или DateTimeOffset.ToString , которая имеет параметр provider , и передачи ей одного из следующих объектов:You can also format a date and time value for a specific culture by calling a DateTime.ToString or DateTimeOffset.ToString overload that has a provider parameter and passing it either of the following:

  • объекта CultureInfo , представляющего язык и региональные параметры, соглашения о форматировании которых требуется использовать.A CultureInfo object that represents the culture whose formatting conventions are to be used. Его метод CultureInfo.GetFormat возвращает значение свойства CultureInfo.DateTimeFormat , которое является объектом DateTimeFormatInfo , предоставляющим сведения о форматировании в соответствии с языком и региональными параметрами для значений даты и времени;Its CultureInfo.GetFormat method returns the value of the CultureInfo.DateTimeFormat property, which is the DateTimeFormatInfo object that provides culture-specific formatting information for date and time values.

  • объекта DateTimeFormatInfo , определяющего соглашения о форматировании для используемых языка и региональных параметров.A DateTimeFormatInfo object that defines the culture-specific formatting conventions to be used. Метод GetFormat этого класса возвращает экземпляр его самого.Its GetFormat method returns an instance of itself.

В следующем примере объекты DateTimeFormatInfo , представляющие "Английский (США)" и "Английский (Соединенное Королевство)" язык и региональные параметры, а также "Французский" и "Русский" нейтральные языки и региональные параметры, используются для форматирования даты.The following example uses DateTimeFormatInfo objects that represent the English (United States) and English (Great Britain) cultures and the French and Russian neutral cultures to format a date.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {                                                                                                    
      DateTime dat1 = new DateTime(2012, 5, 28, 11, 30, 0);
      string[] cultureNames = { "en-US", "en-GB", "ru", "fr" };
      
      foreach (var name in cultureNames) {
         DateTimeFormatInfo dtfi = CultureInfo.CreateSpecificCulture(name).DateTimeFormat;
         Console.WriteLine("{0}: {1}", name, dat1.ToString(dtfi));
      }   
   }
}
// The example displays the following output:
//       en-US: 5/28/2012 11:30:00 AM
//       en-GB: 28/05/2012 11:30:00
//       ru: 28.05.2012 11:30:00
//       fr: 28/05/2012 11:30:00
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim dat1 As Date = #5/28/2012 11:30AM#
      Dim cultureNames() As String = { "en-US", "en-GB", "ru", "fr" }
      
      For Each name In cultureNames
         Dim dtfi As DateTimeFormatInfo = CultureInfo.CreateSpecificCulture(name).DateTimeFormat
         Console.WriteLine("{0}: {1}", name, dat1.ToString(dtfi))
      Next   
   End Sub
End Module
' The example displays the following output:
'       en-US: 5/28/2012 11:30:00 AM
'       en-GB: 28/05/2012 11:30:00
'       ru: 28.05.2012 11:30:00
'       fr: 28/05/2012 11:30:00

Интерфейс IFormattableThe IFormattable interface

Обычно типы, в которых имеется перегрузка метода ToString , использующая строку формата и параметр IFormatProvider , также реализуют интерфейс IFormattable .Typically, types that overload the ToString method with a format string and an IFormatProvider parameter also implement the IFormattable interface. Единственный член этого интерфейса — метод IFormattable.ToString(String, IFormatProvider), параметрами которого являются строка формата и поставщик форматирования.This interface has a single member, IFormattable.ToString(String, IFormatProvider), that includes both a format string and a format provider as parameters.

Реализация интерфейса IFormattable в прикладных типах позволяет получить два преимущества:Implementing the IFormattable interface for your application-defined class offers two advantages:

  • Поддержка строковых преобразований с помощью класса Convert .Support for string conversion by the Convert class. При вызове методов Convert.ToString(Object) и Convert.ToString(Object, IFormatProvider) автоматически вызывается пользовательская реализация IFormattable .Calls to the Convert.ToString(Object) and Convert.ToString(Object, IFormatProvider) methods call your IFormattable implementation automatically.

  • Поддержка составного форматирования.Support for composite formatting. Если для форматирования пользовательского типа используется элемент форматирования, включающий строку формата, то среда CLR автоматически вызывает пользовательскую реализацию IFormattable , передавая ей строку формата.If a format item that includes a format string is used to format your custom type, the common language runtime automatically calls your IFormattable implementation and passes it the format string. Дополнительные сведения о составном форматировании с помощью таких методов, как String.Format или Console.WriteLine, см. в подразделе Составное форматирование .For more information about composite formatting with methods such as String.Format or Console.WriteLine, see the Composite Formatting section.

В следующем примере определяется класс Temperature , реализующий интерфейс IFormattable .The following example defines a Temperature class that implements the IFormattable interface. Он поддерживает описатели формата "C" и "G", позволяющие отобразить значение температуры в градусах Цельсия, описатель формата "F", позволяющий отобразить значение температуры в градусах Фаренгейта, и описатель формата "K", позволяющий отобразить значение температуры в градусах Кельвина.It supports the "C" or "G" format specifiers to display the temperature in Celsius, the "F" format specifier to display the temperature in Fahrenheit, and the "K" format specifier to display the temperature in Kelvin.

using System;
using System.Globalization;

public class Temperature : IFormattable
{
   private decimal m_Temp;

   public Temperature(decimal temperature)
   {
      this.m_Temp = temperature;
   }
   
   public decimal Celsius
   {
      get { return this.m_Temp; }
   }
   
   public decimal Kelvin
   {
      get { return this.m_Temp + 273.15m; }   
   }
   
   public decimal Fahrenheit
   {
      get { return Math.Round((decimal) this.m_Temp * 9 / 5 + 32, 2); }
   }

   public override string ToString()
   {
      return this.ToString("G", null);
   }
   
   public string ToString(string format)
   {
      return this.ToString(format, null);
   }
   
   public string ToString(string format, IFormatProvider provider)  
   {
      // Handle null or empty arguments.
      if (String.IsNullOrEmpty(format))
         format = "G";
      // Remove any white space and covert to uppercase.
      format = format.Trim().ToUpperInvariant();

      if (provider == null)
         provider = NumberFormatInfo.CurrentInfo;
            
      switch (format)
      {
         // Convert temperature to Fahrenheit and return string.
         case "F":
            return this.Fahrenheit.ToString("N2", provider) + "°F";
         // Convert temperature to Kelvin and return string.
         case "K":
            return this.Kelvin.ToString("N2", provider) + "K";
         // Return temperature in Celsius.
         case "C":
         case "G":
            return this.Celsius.ToString("N2", provider) + "°C";
         default:
            throw new FormatException(String.Format("The '{0}' format string is not supported.", format));
      }      
   }
}
Imports System.Globalization

Public Class Temperature : Implements IFormattable
   Private m_Temp As Decimal

   Public Sub New(temperature As Decimal)
      Me.m_Temp = temperature
   End Sub
   
   Public ReadOnly Property Celsius() As Decimal
      Get
         Return Me.m_Temp
      End Get   
   End Property
   
   Public ReadOnly Property Kelvin() As Decimal
      Get
         Return Me.m_Temp + 273.15d   
      End Get
   End Property
   
   Public ReadOnly Property Fahrenheit() As Decimal
      Get
         Return Math.Round(CDec(Me.m_Temp * 9 / 5 + 32), 2)
      End Get      
   End Property

   Public Overrides Function ToString() As String
      Return Me.ToString("G", Nothing)
   End Function
   
   Public Overloads Function ToString(format As String) As String
      Return Me.ToString(format, Nothing)
   End Function
   
   Public Overloads Function ToString(format As String, provider As IFormatProvider) As String _  
      Implements IFormattable.ToString

      ' Handle null or empty arguments.
      If String.IsNullOrEmpty(format) Then format = "G"
      ' Remove any white space and convert to uppercase.
      format = format.Trim().ToUpperInvariant()

      If provider Is Nothing Then provider = NumberFormatInfo.CurrentInfo
            
      Select Case format
         ' Convert temperature to Fahrenheit and return string.
         Case "F"
            Return Me.Fahrenheit.ToString("N2", provider) & "°F"
         ' Convert temperature to Kelvin and return string.
         Case "K"
            Return Me.Kelvin.ToString("N2", provider) & "K"
         ' Return temperature in Celsius.
         Case "C", "G"
            Return Me.Celsius.ToString("N2", provider) & "°C"
         Case Else
            Throw New FormatException(String.Format("The '{0}' format string is not supported.", format))
      End Select      
   End Function
End Class

В следующем примере создается объект Temperature.The following example instantiates a Temperature object. Затем в нем вызывается метод ToString . Использование нескольких строк составного формата позволяет получить различные строковые представления объекта Temperature .It then calls the ToString method and uses several composite format strings to obtain different string representations of a Temperature object. В свою очередь каждый из этих вызовов метода вызывает реализацию IFormattable класса Temperature .Each of these method calls, in turn, calls the IFormattable implementation of the Temperature class.

public class Example
{
   public static void Main()
   {
      CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
      Temperature temp = new Temperature(22m);
      Console.WriteLine(Convert.ToString(temp, new CultureInfo("ja-JP")));
      Console.WriteLine("Temperature: {0:K}", temp);
      Console.WriteLine("Temperature: {0:F}", temp);
      Console.WriteLine(String.Format(new CultureInfo("fr-FR"), "Temperature: {0:F}", temp));
   }
}
// The example displays the following output:
//       22.00°C
//       Temperature: 295.15K
//       Temperature: 71.60°F
//       Temperature: 71,60°F
Public Module Example
   Public Sub Main()
      Dim temp As New Temperature(22d)
      CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US")
      Console.WriteLine(Convert.ToString(temp1, New CultureInfo("ja-JP")))
      Console.WriteLine("Temperature: {0:K}", temp)
      Console.WriteLine("Temperature: {0:F}", temp)
      Console.WriteLine(String.Format(New CultureInfo("fr-FR"), "Temperature: {0:F}", temp)) 
   End Sub
End Module
' The example displays the following output:
'       22.00°C
'       Temperature: 295.15K
'       Temperature: 71.60°F
'       Temperature: 71,60°F

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

Некоторые методы, например String.Format и StringBuilder.AppendFormat, поддерживают составное форматирование.Some methods, such as String.Format and StringBuilder.AppendFormat, support composite formatting. Строка составного формата — это некий шаблон, возвращающий единую строку, включающую строковое представление нулевого, единичного или другого числа объектов.A composite format string is a kind of template that returns a single string that incorporates the string representation of zero, one, or more objects. Каждый объект представляется в строке составного формата индексированным элементом форматирования.Each object is represented in the composite format string by an indexed format item. Индекс элемента форматирования соответствует положению представляющего его объекта в списке параметров метода.The index of the format item corresponds to the position of the object that it represents in the method's parameter list. Индексы отсчитываются от нуля.Indexes are zero-based. Например, в вызове метода String.Format первый элемент форматирования, {0:D}, замещается строковым представлением thatDate; второй элемент форматирования, {1}, замещается строковым представлением item1; а третий элемент форматирования, {2:C2}, замещается строковым представлением item1.Value.For example, in the following call to the String.Format method, the first format item, {0:D}, is replaced by the string representation of thatDate; the second format item, {1}, is replaced by the string representation of item1; and the third format item, {2:C2}, is replaced by the string representation of item1.Value.

result = String.Format("On {0:d}, the inventory of {1} was worth {2:C2}.", 
                       thatDate, item1, item1.Value);
Console.WriteLine(result);                            
// The example displays output like the following if run on a system
// whose current culture is en-US:
//       On 5/1/2009, the inventory of WidgetA was worth $107.44.
result = String.Format("On {0:d}, the inventory of {1} was worth {2:C2}.", _
                       thatDate, item1, item1.Value)
Console.WriteLine(result)                            
' The example displays output like the following if run on a system
' whose current culture is en-US:
'       On 5/1/2009, the inventory of WidgetA was worth $107.44.

Помимо замены элементов форматирования строковыми представлениями соответствующего объекта, элементы форматирования также позволяют управлять перечисленными ниже аспектами.In addition to replacing a format item with the string representation of its corresponding object, format items also let you control the following:

  • Вы можете указать конкретный способ представления объекта в виде строки, если объект реализует интерфейс IFormattable и поддерживает строки формата.The specific way in which an object is represented as a string, if the object implements the IFormattable interface and supports format strings. Для этого после индекса элемента форматирования необходимо ввести : (двоеточие), а за ним — допустимую строку формата.You do this by following the format item's index with a : (colon) followed by a valid format string. В предыдущем примере для этого выполнялось форматирование значения даты с помощью строки формата "d" (шаблон короткого формата даты, например, {0:d}) и форматирование числового значения с помощью строки формата "C2" (например, {2:C2} для представления числа в виде значения валюты с двумя цифрами дробной части).The previous example did this by formatting a date value with the "d" (short date pattern) format string (e.g., {0:d}) and by formatting a numeric value with the "C2" format string (e.g., {2:C2} to represent the number as a currency value with two fractional decimal digits.

  • Вы можете задать ширину поля, содержащего строковое представление объекта, и выравнивание строкового представления в этом поле.The width of the field that contains the object's string representation, and the alignment of the string representation in that field. Для этого после индекса элемента форматирования необходимо ввести , (запятую), а за ней — значение ширины поля.You do this by following the format item's index with a , (comma) followed the field width. Строка выравнивается по правому краю поля, если ширина поля — положительное значение, и по левому краю, если ширина поля — отрицательное значение.The string is right-aligned in the field if the field width is a positive value, and it is left-aligned if the field width is a negative value. В примере ниже значения даты выравниваются по левому краю поля из 20 символов, а десятичные значения с одной цифрой дробной части — по правом краю поля из 11 символов.The following example left-aligns date values in a 20-character field, and it right-aligns decimal values with one fractional digit in an 11-character field.

    DateTime startDate = new DateTime(2015, 8, 28, 6, 0, 0);
    decimal[] temps = { 73.452m, 68.98m, 72.6m, 69.24563m,
                       74.1m, 72.156m, 72.228m };
    Console.WriteLine("{0,-20} {1,11}\n", "Date", "Temperature");
    for (int ctr = 0; ctr < temps.Length; ctr++)
       Console.WriteLine("{0,-20:g} {1,11:N1}", startDate.AddDays(ctr), temps[ctr]);
    
    // The example displays the following output:
    //       Date                 Temperature
    //
    //       8/28/2015 6:00 AM           73.5
    //       8/29/2015 6:00 AM           69.0
    //       8/30/2015 6:00 AM           72.6
    //       8/31/2015 6:00 AM           69.2
    //       9/1/2015 6:00 AM            74.1
    //       9/2/2015 6:00 AM            72.2
    //       9/3/2015 6:00 AM            72.2
    
    Dim startDate As New Date(2015, 8, 28, 6, 0, 0)
    Dim temps() As Decimal = { 73.452, 68.98, 72.6, 69.24563,
                               74.1, 72.156, 72.228 }
    Console.WriteLine("{0,-20} {1,11}", "Date", "Temperature")
    Console.WriteLine()
    For ctr As Integer = 0 To temps.Length - 1
       Console.WriteLine("{0,-20:g} {1,11:N1}", startDate.AddDays(ctr), temps(ctr))
    Next
    ' The example displays the following output:
    '       Date                 Temperature
    '
    '       8/28/2015 6:00 AM           73.5
    '       8/29/2015 6:00 AM           69.0
    '       8/30/2015 6:00 AM           72.6
    '       8/31/2015 6:00 AM           69.2
    '       9/1/2015 6:00 AM            74.1
    '       9/2/2015 6:00 AM            72.2
    '       9/3/2015 6:00 AM            72.2
    

    Обратите внимание на то, что если присутствует и компонент выравнивания строки, и компонент строки формата, первый из них предшествует последнему (например, {0,-20:g}).Note that, if both the alignment string component and the format string component are present, the former precedes the latter (for example, {0,-20:g}.

Дополнительные сведения о составном форматировании см. в разделе Composite Formatting.For more information about composite formatting, see Composite Formatting.

Настраиваемое форматирование с использованием интерфейса ICustomFormatterCustom formatting with ICustomFormatter

У двух методов составного форматирования — String.Format(IFormatProvider, String, Object[]) и StringBuilder.AppendFormat(IFormatProvider, String, Object[])— также имеется параметр, задающий поставщик форматирования, поддерживающий настраиваемое форматирование.Two composite formatting methods, String.Format(IFormatProvider, String, Object[]) and StringBuilder.AppendFormat(IFormatProvider, String, Object[]), include a format provider parameter that supports custom formatting. При вызове какого-либо из этих методов форматирования объект Type , представляющий интерфейс ICustomFormatter , передается методу GetFormat поставщика форматирования.When either of these formatting methods is called, it passes a Type object that represents an ICustomFormatter interface to the format provider’s GetFormat method. Метод GetFormat должен вернуть реализацию ICustomFormatter , поддерживающую настраиваемое форматирование.The GetFormat method is then responsible for returning the ICustomFormatter implementation that provides custom formatting.

Единственный метод интерфейса ICustomFormatter , который называется Format(String, Object, IFormatProvider), автоматически вызывается методом составного форматирования по одному разу для каждого элемента форматирования в строке составного формата.The ICustomFormatter interface has a single method, Format(String, Object, IFormatProvider), that is called automatically by a composite formatting method, once for each format item in a composite format string. У метода Format(String, Object, IFormatProvider) есть три параметра: строка формата, представляющая аргумент formatString в элементе форматирования, сам форматируемый объект и объект IFormatProvider , предоставляющий услуги форматирования.The Format(String, Object, IFormatProvider) method has three parameters: a format string, which represents the formatString argument in a format item, an object to format, and an IFormatProvider object that provides formatting services. Обычно класс, реализующий интерфейс ICustomFormatter , также реализует интерфейс IFormatProvider, поэтому в таком случае последний параметр будет ссылкой на сам класс настраиваемого форматирования.Typically, the class that implements ICustomFormatter also implements IFormatProvider, so this last parameter is a reference to the custom formatting class itself. Метод возвращает настраиваемое строковое представление объекта, который нужно было отформатировать.The method returns a custom formatted string representation of the object to be formatted. Если методу не удается отформатировать объект, он должен вернуть пустую ссылку (Nothing в Visual Basic).If the method cannot format the object, it should return a null reference (Nothing in Visual Basic).

В следующем примере приведена реализация ICustomFormatter с именем ByteByByteFormatter , отображающая целочисленные значения в виде последовательности пар шестидесятеричных цифр, разделенных пробелами.The following example provides an ICustomFormatter implementation named ByteByByteFormatter that displays integer values as a sequence of two-digit hexadecimal values followed by a space.

public class ByteByByteFormatter : 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 (! formatProvider.Equals(this)) return null;
      
      // Handle only hexadecimal format string.
      if (! format.StartsWith("X")) return null;
      
      byte[] bytes;
      string output = null;
      
      // Handle only integral types.
      if (arg is Byte) 
         bytes = BitConverter.GetBytes((Byte) arg);
      else if (arg is Int16)
         bytes = BitConverter.GetBytes((Int16) arg);
      else if (arg is Int32)
         bytes = BitConverter.GetBytes((Int32) arg);
      else if (arg is Int64)   
         bytes = BitConverter.GetBytes((Int64) arg);
      else if (arg is SByte)
         bytes = BitConverter.GetBytes((SByte) arg);
      else if (arg is UInt16)
         bytes = BitConverter.GetBytes((UInt16) arg);
      else if (arg is UInt32)
         bytes = BitConverter.GetBytes((UInt32) arg);
      else if (arg is UInt64)
         bytes = BitConverter.GetBytes((UInt64) arg);
      else
         return null;

      for (int ctr = bytes.Length - 1; ctr >= 0; ctr--)
         output += String.Format("{0:X2} ", bytes[ctr]);   
      
      return output.Trim();
   }
}
Public Class ByteByByteFormatter : 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, arg As Object, 
                          formatProvider As IFormatProvider) As String _
                          Implements ICustomFormatter.Format

      If Not formatProvider.Equals(Me) Then Return Nothing

      ' Handle only hexadecimal format string.
      If Not fmt.StartsWith("X") Then 
            Return Nothing
      End If

      ' Handle only integral types.
      If Not typeof arg Is Byte AndAlso
         Not typeof arg Is Int16 AndAlso
         Not typeof arg Is Int32 AndAlso
         Not typeof arg Is Int64 AndAlso
         Not typeof arg Is SByte AndAlso
         Not typeof arg Is UInt16 AndAlso
         Not typeof arg Is UInt32 AndAlso
         Not typeof arg Is UInt64 Then _
            Return Nothing

      Dim bytes() As Byte = BitConverter.GetBytes(arg)
      Dim output As String = Nothing
         
      For ctr As Integer = bytes.Length - 1 To 0 Step -1
         output += String.Format("{0:X2} ", bytes(ctr))   
      Next
      
      Return output.Trim()
   End Function
End Class

В следующем примере класс ByteByByteFormatter используется для форматирования целочисленных значений.The following example uses the ByteByByteFormatter class to format integer values. Обратите внимание, что метод ICustomFormatter.Format вызывается во втором вызове метода String.Format(IFormatProvider, String, Object[]) несколько раз и что в третьем вызове метода используется поставщик NumberFormatInfo по умолчанию, поскольку методByteByByteFormatter.FormatNote that the ICustomFormatter.Format method is called more than once in the second String.Format(IFormatProvider, String, Object[]) method call, and that the default NumberFormatInfo provider is used in the third method call because the .ByteByByteFormatter.Format не распознает строку формата "N0" и возвращает пустую ссылку (Nothing в Visual Basic).method does not recognize the "N0" format string and returns a null reference (Nothing in Visual Basic).

public class Example
{
   public static void Main()
   {
      long value = 3210662321; 
      byte value1 = 214;
      byte value2 = 19;
      
      Console.WriteLine(String.Format(new ByteByByteFormatter(), "{0:X}", value));
      Console.WriteLine(String.Format(new ByteByByteFormatter(), "{0:X} And {1:X} = {2:X} ({2:000})", 
                                      value1, value2, value1 & value2));                                
      Console.WriteLine(String.Format(new ByteByByteFormatter(), "{0,10:N0}", value));
   }
}
// The example displays the following output:
//       00 00 00 00 BF 5E D1 B1
//       00 D6 And 00 13 = 00 12 (018)
//       3,210,662,321
Public Module Example
   Public Sub Main()
      Dim value As Long = 3210662321 
      Dim value1 As Byte = 214
      Dim value2 As Byte = 19
      
      Console.WriteLine((String.Format(New ByteByByteFormatter(), "{0:X}", value)))
      Console.WriteLine((String.Format(New ByteByByteFormatter(), "{0:X} And {1:X} = {2:X} ({2:000})", 
                                      value1, value2, value1 And value2)))                                
      Console.WriteLine(String.Format(New ByteByByteFormatter(), "{0,10:N0}", value))
   End Sub
End Module
' The example displays the following output:
'       00 00 00 00 BF 5E D1 B1
'       00 D6 And 00 13 = 00 12 (018)
'       3,210,662,321
ЗаголовокTitle ОпределениеDefinition
Standard Numeric Format StringsStandard Numeric Format Strings Описание строк стандартного формата, позволяющих создавать общеупотребимые строковые представления числовых значений.Describes standard format strings that create commonly used string representations of numeric values.
Custom Numeric Format StringsCustom Numeric Format Strings Описание строк настраиваемого формата, позволяющих создавать прикладные строковые представления числовых значений.Describes custom format strings that create application-specific formats for numeric values.
Строки стандартных форматов даты и времениStandard Date and Time Format Strings Описание строк стандартного формата, позволяющих создавать общеупотребимые строковые представления значений DateTime .Describes standard format strings that create commonly used string representations of DateTime values.
Строки настраиваемых форматов даты и времениCustom Date and Time Format Strings Описание строк настраиваемого формата, позволяющих создавать прикладные строковые представления значений DateTime .Describes custom format strings that create application-specific formats for DateTime values.
Строки стандартного формата TimeSpanStandard TimeSpan Format Strings Описание строк стандартного формата, позволяющих создавать общеупотребимые строковые представления интервалов времени.Describes standard format strings that create commonly used string representations of time intervals.
Строки настраиваемого формата TimeSpanCustom TimeSpan Format Strings Описание строк настраиваемого формата, позволяющих создавать прикладные строковые представления интервалов времени.Describes custom format strings that create application-specific formats for time intervals.
Enumeration Format StringsEnumeration Format Strings Описание строк стандартного формата, используемых для создания строковых представлений значений перечислений.Describes standard format strings that are used to create string representations of enumeration values.
Составное форматированиеComposite Formatting Описание способа совмещения нескольких форматируемых значений в строке.Describes how to embed one or more formatted values in a string. Строка может быть последовательно отображена в консоли или выведена в поток.The string can subsequently be displayed on the console or written to a stream.
Выполнение операций форматированияPerforming Formatting Operations Перечень разделов, содержащих пошаговые инструкции для выполнения конкретных операций форматирования.Lists topics that provide step-by-step instructions for performing specific formatting operations.
Parsing StringsParsing Strings Описание способов инициализации объектов со значениями, описанными строковыми представлениями этих объектов.Describes how to initialize objects to the values described by string representations of those objects. Разбор является операцией, обратной форматированию.Parsing is the inverse operation of formatting.

СсылкаReference