Форматы и региональные стандарты
У метода
ToString
без параметров есть два недостатка. Во-первых, вызывающая
программа не управляет форматированием строки, как, например, в случае, ког-
да приложению нужно представить число в денежном или десятичном формате,
в процентном или шестнадцатеричном виде. Во-вторых, вызывающая программа не
может выбрать формат, учитывающий конкретные региональные стандарты. Вто-
рой недостаток создает проблемы скорее для серверных приложений, нежели для
кода на стороне клиента. Изредка приложению требуется форматировать строку с
учетом региональных стандартов, отличных от таковых у вызывающего потока. Для
управления форматированием строки нужна версия метода
ToString
, позволяющая
задавать специальное форматирование и сведения о региональных стандартах.
Тип может предложить вызывающей программе выбор форматирования и ре-
гиональных стандартов, если он реализует интерфейс
System.IFormattable
:
public interface IFormattable {
String ToString(String format, IFormatProvider formatProvider);
}
381
Получение.строкового.представления.объекта
В FCL у всех базовых типов (
Byte
,
SByte
,
Int16
/
UInt16
,
Int32
/
UInt32
,
Int64
/
UInt64
,
Single
,
Double
,
Decimal
и
DateTime
) есть реализации этого интерфейса. Кро-
ме того, есть такие реализации и у некоторых других типов, например
GUID
. К тому
же каждый перечислимый тип автоматически реализует интерфейс
IFormattable
,
позволяющий получить строковое выражение для числового значения, содержа-
щегося в экземпляре перечислимого типа.
Метод
ToString
интерфейса
IFormattable
получает два параметра. Первый,
format
, — это строка, сообщающая методу способ форматирования объекта. Вто-
рой,
formatProvider
, — это экземпляр типа, который реализует интерфейс
System.
IFormatProvider
. Этот тип предоставляет методу
ToString
информацию о регио-
нальных стандартах. Как — скоро узнаете.
Тип, реализующий метод
ToString
интерфейса
IFormattable
, определяет до-
пустимые варианты форматирования. Если переданная строка форматирования
неприемлема, тип должен генерировать исключение
System.FormatException
.
Многие типы FCL поддерживают несколько форматов. Например, тип
DateTime
поддерживает следующие форматы:
"d"
— даты в кратком формате,
"D"
— даты
в полном формате,
"g"
— даты в общем формате,
"M"
— формат «месяц/день»,
"s"
—
сортируемые даты,
"T"
— время,
"u"
— универсальное время в стандарте ISO 8601,
"U"
— универсальное время в полном формате,
"Y"
— формат «год/месяц» и т. д.
Все перечислимые типы поддерживают строки:
"G"
— общий формат,
"F"
— формат
флагов,
"D"
— десятичный формат и
"X"
— шестнадцатеричный формат. Подробнее
о форматировании перечислимых типов см. главу 15.
Кроме того, все встроенные числовые типы поддерживают следующие строки:
"C"
— формат валют,
"D"
— десятичный формат,
"E"
— научный (экспоненциаль-
ный) формат,
"F"
— формат чисел с фиксированной точкой,
"G"
— общий формат,
"N"
— формат чисел,
"P"
— формат процентов,
"R"
— обратимый (round-trip) формат
и
"X"
— шестнадцатеричный формат. Числовые типы поддерживают также шаблоны
форматирования для случаев, когда обычных строк форматирования недостаточно.
Шаблоны форматирования содержат специальные символы, позволяющие методу
ToString
данного типа отобразить нужное количество цифр, место разделителя
дробной части, количество знаков в дробной части и т. д. Полную информацию
о строках форматирования см. в разделе .NET Framework SDK, посвященном
форматированию строк.
Если вместо строки форматирования передается
null
, это равносильно вызову
метода
ToString
с параметром
"G"
. Иначе говоря, объекты форматируют себя сами,
применяя по умолчанию «общий формат». Разрабатывая реализацию типа, выбе-
рите формат, который, по вашему мнению, будет использоваться чаще всего; это
и будет «общий формат». Кстати, вызов метода
ToString
без параметров означает
представление объекта в общем формате.
Закончив со строками форматирования, перейдем к региональным стандартам.
По умолчанию форматирование выполняется с учетом региональных стандартов,
связанных с вызывающим потоком. Это свойственно методу
ToString
без параме-
тров и методу
ToString
интерфейса
IFormattable
со значением
null
в качестве
formatProvider
.
382
Do'stlaringiz bilan baham: |