Что делает IFormatProvider? - PullRequest
       43

Что делает IFormatProvider?

82 голосов
/ 03 февраля 2009

Я играл с методом Datetime.ParseExact, и он хочет IFormatProvider ...

Он работает при вводе null, но что именно он делает?

Ответы [ 8 ]

54 голосов
/ 04 февраля 2009

В дополнение к ответу Яна Бойда:

Также CultureInfo реализует этот интерфейс и может использоваться в вашем случае. Таким образом, вы можете проанализировать французскую строку даты, например; Вы могли бы использовать

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
40 голосов
/ 12 августа 2013

Интерфейс 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"));

Примечание : любой код публикуется в открытом доступе. Указание авторства не требуется.

16 голосов
/ 07 января 2013

Передача нуля как IFormatProvider - неправильный способ сделать это. Если у пользователя есть пользовательский формат даты / времени на его ПК, у вас будут проблемы при разборе и преобразовании в строку. Я только что исправил ошибку, когда кто-то передавал null как IFormatProvider при преобразовании в строку.

Вместо этого вы должны использовать CultureInfo.InvariantCulture

Неправильно:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);

Правильно:

string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
5 голосов
/ 03 февраля 2009

IFormatProvider предоставляет информацию о культуре для рассматриваемого метода. DateTimeFormatInfo реализует IFormatProvider и позволяет вам указать формат, в котором вы хотите отображать дату / время. Примеры можно найти на соответствующих страницах MSDN.

5 голосов
/ 03 февраля 2009

Здесь можно посмотреть http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx

См. Примечания и пример раздела там.

2 голосов
/ 02 февраля 2017

По MSDN

.NET Framework включает следующие три предопределенные реализации IFormatProvider для предоставления специфичной для культуры информации, которая используется при форматировании или анализе числовых значений, а также значений даты и времени:

  1. Класс NumberFormatInfo, который предоставляет информацию, используемую для форматирования чисел, такую ​​как валюта, символы разделителя тысяч и символы десятичного разделителя для конкретной культуры. Для получения информации о предопределенных строках формата, распознаваемых объектом NumberFormatInfo и используемых в операциях форматирования чисел, см. Строки стандартного числового формата и строки пользовательского числового формата.
  2. Класс DateTimeFormatInfo, предоставляющий информацию, используемую для форматирования даты и времени, такую ​​как символы разделителя даты и времени для конкретной культуры или порядок и формат компонентов даты, года, месяца и дня. Для получения информации о предопределенных строках формата, распознаваемых объектом DateTimeFormatInfo и используемых в операциях форматирования чисел, см. Строки стандартного формата даты и времени и Строки пользовательского формата даты и времени.
  3. Класс CultureInfo, представляющий определенную культуру. Его метод GetFormat возвращает специфичный для культуры объект NumberFormatInfo или DateTimeFormatInfo, в зависимости от того, используется ли объект CultureInfo в операции форматирования или синтаксического анализа, которая включает числа, даты и время.

.NET Framework также поддерживает пользовательское форматирование. Обычно это включает создание класса форматирования, который реализует IFormatProvider и ICustomFormatter. Экземпляр этого класса затем передается в качестве параметра методу, который выполняет пользовательскую операцию форматирования, такую ​​как String.Format(IFormatProvider, String, Object[]).

2 голосов
/ 03 февраля 2009
1 голос
/ 03 февраля 2009

Класс DateTimeFormatInfo реализует этот интерфейс, поэтому он позволяет контролировать форматирование строк DateTime.

...