Что делает 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);
Ответ 4
Здесь вы можете увидеть http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Смотрите раздел замечаний и примеров.
Ответ 5
IFormatProvider предоставляет информацию о культуре этому методу. DateTimeFormatInfo реализует IFormatProvider и позволяет указать формат, в котором вы хотите отображать дату/время. Примеры можно найти в соответствующих Страницы MSDN.
Ответ 6
Отметьте http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx для API.
Ответ 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.