Что делает IFormatProvider?
-
21-08-2019 - |
Вопрос
Я играл с методом Datetime.ParseExact, и ему нужен IFormatProvider...
Он работает при вводе нуля, но что именно он делает?
Решение
В дополнение к ответу Яна Бойда:
Также CultureInfo
реализует этот интерфейс и может быть использован в вашем случае.Например, вы можете проанализировать строку даты на французском языке;ты мог бы использовать
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
Другие советы
В 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
.Например.имя бога в разных культурах
- бог
- Бог
- Иегова
- Яхве
- יהוה
- אהיה אשר אהיה
Это позволяет вашему заказу LordsNameFormatInfo
классная поездка внутри IFormatProvider
, и вы можете сохранить идиому.
На самом деле вам никогда не придется звонить GetFormat
метод IFormatProvider
сам.
Всякий раз, когда вам понадобится IFormatProvider
ты можешь пройти CultureInfo
объект:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Примечание:Любой код выпускается в общественное достояние.Атрибуция не требуется.
Передача нуля как 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);
Вы можете увидеть здесь http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
См. раздел примечаний и примеров там.
Иформатпровидер предоставляет информацию о культуре рассматриваемому методу. ДатаВремяФорматИнфо реализует IFormatProvider и позволяет вам указать формат, в котором вы хотите, чтобы ваша дата/время отображались.Примеры можно найти на соответствующих страницах MSDN.
Проверять http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx для API.
К MSDN
.NET Framework включает в себя следующее три предопределенные реализации IFormatProvider для предоставления информации, зависящей от языка и региональных параметров, которая используется при форматировании или анализе числовых значений, а также значений даты и времени:
- А
NumberFormatInfo
класс, который предоставляет информацию, используемую для форматирования чисел, такую как денежная единица, разделитель тысяч и символы десятичного разделителя для определенной культуры.Для получения информации о строках предопределенного формата, распознаваемыхNumberFormatInfo
объект и используется в операциях числового форматирования, см. разделы «Строки стандартного числового формата» и «Строки пользовательского числового формата». - А
DateTimeFormatInfo
класс, который предоставляет информацию, используемую для форматирования даты и времени, например символы разделителя даты и времени для определенного языка и региональных параметров или порядок и формат компонентов года, месяца и дня даты.Для получения информации о строках предопределенного формата, распознаваемыхDateTimeFormatInfo
объект и используется в операциях числового форматирования, см. разделы «Строки стандартного формата даты и времени» и «Строки пользовательского формата даты и времени». - А
CultureInfo
класс, который представляет определенную культуру.ЕгоGetFormat
метод возвращает специфичный для культурыNumberFormatInfo
илиDateTimeFormatInfo
объект, в зависимости от того,CultureInfo
Объект используется в операции форматирования или синтаксического анализа, которая включает числа, даты и время.
.NET Framework также поддерживает пользовательское форматирование.Обычно это предполагает создание класса форматирования, реализующего как IFormatProvider, так и ICustomFormatter.Экземпляр этого класса затем передается в качестве параметра методу, который выполняет пользовательскую операцию форматирования, например String.Format(IFormatProvider, String, Object[])
.
В ДатаВремяФорматИнфо класс реализует этот интерфейс, поэтому он позволяет вам контролировать форматирование строк DateTime.