Что делает IFormatProvider?

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

Он выполняет ввод значения null, но что именно он делает?

Ответ 1

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

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.Parse(yourDateInputString, yourFormatString, ci);

Ответ 2

Интерфейс IFormatProvider обычно реализуется для вас классом CultureInfo, например:

  • 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"));

Примечание. Любой код выпущен в общедоступном домене. Не требуется атрибуция.

Ответ 3

Передача нулевого значения в качестве 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

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

Ответ 7

MSDN

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

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

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

Ответ 8

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