Интерфейс IFormatProvider
обычно реализуется для вас классом CultureInfo
, например ::100100
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
Интерфейс является шлюзом для функции, позволяющей получить набор данных, специфичных для культуры, из культуры. Два общедоступных объекта культуры, к которым можно запросить IFormatProvider
:
DateTimeFormatInfo
NumberFormatInfo
Как обычно, вы просите IFormatProvider
предоставить вам DateTimeFormatInfo
объект:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Существует также знание того, что любой интерфейс IFormatProvider
, вероятно, реализуется классом, который убывает с CultureInfo
или спускается с DateTimeFormatInfo
, так что вы можете привести интерфейс непосредственно:
CultureInfo info = provider as CultureInfo;
if (info != null)
format = info.DateTimeInfo;
else
{
DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
if (dtfi != null)
format = dtfi;
else
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}
if (format != null)
DoStuffWithDatesOrTimes(format);
Но не делай этого
Вся эта тяжелая работа уже написана для вас:
Чтобы получить DateTimeFormatInfo
от IFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Чтобы получить NumberFormatInfo
от IFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Значение IFormatProvider
заключается в том, что вы создаете свои собственные объекты культуры. Пока они реализуют IFormatProvider
и возвращают запрашиваемые объекты, вы можете обойти встроенные культуры.
Вы также можете использовать IFormatProvider
для передачи произвольных объектов культуры - через IFormatProvider
. Например. имя бога в разных культурах
- бог
- Бог
- Jehova
- Яхве
- יהוה
- אהיה אשר אהיה
Это позволяет вашему классу LordsNameFormatInfo
перемещаться внутри IFormatProvider
, и вы можете сохранить идиому.
На самом деле вам никогда не нужно будет вызывать GetFormat
метод IFormatProvider
самостоятельно.
Всякий раз, когда вам нужен IFormatProvider
, вы можете передать CultureInfo
объект:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Примечание : любой код публикуется в открытом доступе. Указание авторства не требуется.