yyyy c# asp.net iformatprovider

yyyy - iformatprovider decimal c#



¿Qué hace IFormatProvider? (8)

Además de la respuesta de Ian Boyd:

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

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

Estaba jugando con el método Datetime.ParseExact, y quiere un IFormatProvider ...

Funciona ingresando nulo, pero ¿qué es exactamente lo que hace?



La clase DateTimeFormatInfo implementa esta interfaz, por lo que le permite controlar el formato de sus cadenas DateTime.


La interfaz IFormatProvider normalmente la implementa una clase CultureInfo , por ejemplo:

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

La interfaz es una puerta de enlace de una función para obtener un conjunto de datos específicos de una cultura. Los dos objetos de cultura comúnmente disponibles por los que se puede consultar un IFormatProvider son:

  • DateTimeFormatInfo
  • NumberFormatInfo

La forma en que normalmente funcionaría es pedirle a IFormatProvider que le proporcione un objeto DateTimeFormatInfo :

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

También hay conocimiento interno de que cualquier interfaz IFormatProvider probablemente esté siendo implementada por una clase que desciende de CultureInfo , o desciende de DateTimeFormatInfo , para que pueda 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 trabajo duro ya ha sido escrito para ti:

Para obtener un DateTimeFormatInfo desde un IFormatProvider :

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

Para obtener un NumberFormatInfo desde un IFormatProvider :

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

El valor de IFormatProvider es que crees tus propios objetos de cultura. Siempre y cuando implementen IFormatProvider y devuelvan los objetos que se les solicitan, puede omitir las culturas incorporadas.

También puede usar IFormatProvider para pasar objetos de cultivo arbitrarios a través del IFormatProvider . Ej. El nombre de dios en diferentes culturas

  • Dios
  • Dios
  • Jehova
  • Yahwe
  • יהוה
  • אהיה אשר אהיה

Esto permite que su clase LordsNameFormatInfo personalizada viaje dentro de un IFormatProvider , y puede preservar la expresión idiomática.

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

Siempre que necesite un IFormatProvider puede pasar un objeto CultureInfo :

DateTime.Now.ToString(CultureInfo.CurrentCulture); endTime.ToString(CultureInfo.InvariantCulture); transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));

Nota : Cualquier código se libera en el dominio público. No se requiere atribución.


Pasar nulo como IFormatProvider no es la forma correcta de hacerlo. Si el usuario tiene un formato de fecha / hora personalizado en su PC, tendrá problemas al analizar y convertir a cadena. Acabo de corregir un error por el cual alguien pasó nulo como IFormatProvider al convertir a cadena.

En su lugar, debe utilizar 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);


Por MSDN

.NET Framework incluye las siguientes tres implementaciones predefinidas de IFormatProvider para proporcionar información cultural específica que se utiliza para formatear o analizar valores numéricos y de fecha y hora:

  1. La clase NumberFormatInfo , que proporciona información que se utiliza para formatear números, como la moneda, el separador de miles y los símbolos de separador decimal para una cultura en particular. Para obtener información acerca de las cadenas de formato predefinidas reconocidas por un objeto NumberFormatInfo y utilizadas en las operaciones de formateo numérico, vea Cadenas estándar de formato numérico y Cadenas de formato numérico personalizado.
  2. La clase DateTimeFormatInfo , que proporciona información que se utiliza para formatear fechas y horas, como los símbolos separadores de fecha y hora para una cultura en particular o el orden y el formato de los componentes de año, mes y día de una fecha. Para obtener información acerca de las cadenas de formato predefinidas reconocidas por un objeto DateTimeFormatInfo y utilizadas en las operaciones de formateo numérico, vea Cadenas estándar de formato de fecha y hora, y cadenas de formato de fecha y hora personalizadas.
  3. La clase CultureInfo , que representa una cultura particular. Su método GetFormat devuelve un objeto NumberFormatInfo o DateTimeFormatInfo específico del NumberFormatInfo , dependiendo de si el objeto CultureInfo se utiliza en una operación de formateo o análisis que involucra números o fechas y horas.

.NET Framework también es compatible con el formato personalizado. Esto generalmente implica la creación de una clase de formato que implementa tanto IFormatProvider como ICustomFormatter. A continuación, se pasa una instancia de esta clase como parámetro a un método que realiza una operación de formateo personalizada, como String.Format(IFormatProvider, String, Object[]) .