¿Qué hace IFormatProvider?

¿Qué hace IFormatProvider?

Además de la respuesta de Ian Boyd:

También CultureInfo implementa esta interfaz y se puede utilizar en su caso. Por lo tanto, podría analizar una cadena de fecha en francés, por ejemplo; podrías usar

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

El IFormatProvider la interfaz normalmente se implementa para usted mediante un CultureInfo clase, por ejemplo:

  • CultureInfo.CurrentCulture
  • CultureInfo.CurrentUICulture
  • CultureInfo.InvariantCulture
  • CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)

La interfaz es una puerta de entrada para que una función obtenga un conjunto de datos específicos de una cultura. Los dos objetos culturales comúnmente disponibles que un IFormatProvider se pueden consultar son:

  • DateTimeFormatInfo
  • NumberFormatInfo

La forma en que normalmente funcionaría es preguntarle al IFormatProvider para darte un DateTimeFormatInfo objeto:

DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
   DoStuffWithDatesOrTimes(format);

También hay conocimiento interno de que cualquier IFormatProvider Es probable que la interfaz esté siendo implementada por una clase que desciende de CultureInfo , o desciende de DateTimeFormatInfo , por lo que podría transmitir la interfaz directamente:

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

Pero no hagas eso

Todo ese arduo trabajo ya ha sido escrito para ti:

Para obtener un DateTimeFormatInfo de un IFormatProvider :

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

Para obtener un NumberFormatInfo de un IFormatProvider :

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

El valor de IFormatProvider es que tu creas tus propios objetos de cultura. Siempre y cuando implementen IFormatProvider y devolver los objetos que se les solicitan, puede omitir las referencias culturales integradas.

También puedes usar IFormatProvider para una forma de pasar objetos culturales arbitrarios - a través del IFormatProvider . P.ej. el nombre de dios en diferentes culturas

  • dios
  • Dios
  • Jehová
  • Yahvé
  • יהוה
  • אהיה אשר אהיה

Esto permite que su LordsNameFormatInfo personalizado paseo en clase dentro de un IFormatProvider y puedes conservar el idioma.

En realidad, nunca necesitarás llamar al GetFormat método de IFormatProvider usted mismo.

Siempre que necesite un IFormatProvider puedes pasar un CultureInfo objeto:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));

Pasar nulo como IFormatProvider no es la forma correcta de hacer esto. Si el usuario tiene un formato de fecha/hora personalizado en su PC, tendrá problemas para analizar y convertir a cadena. Acabo de corregir un error en el que alguien había pasado nulo como IFormatProvider al convertir a cadena.

En su lugar, deberías usar CultureInfo.InvariantCulture

Incorrecto:

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

Correcto:

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