web-dev-qa-db-fra.com

Que fait IFormatProvider?

Je jouais avec la méthode Datetime.ParseExact, et il veut un IFormatProvider ...

Cela fonctionne en entrant null, mais que fait-il exactement?

84
Moulde

En plus de la réponse de Ian Boyd:

De plus, CultureInfo implémente cette interface et peut être utilisé dans votre cas. Ainsi, vous pouvez analyser une chaîne de date française par exemple; vous pourriez utiliser

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
56
Andrei Rînea

L’interface IFormatProvider est normalement implémentée pour vous par une classe CultureInfo, par exemple:

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

L'interface est une passerelle permettant à une fonction d'obtenir un ensemble de données spécifiques à une culture à partir d'une culture. Les deux objets de culture couramment disponibles pour lesquels un IFormatProvider peut être interrogé sont:

  • DateTimeFormatInfo
  • NumberFormatInfo

Cela fonctionnerait normalement si vous demandiez au IFormatProvider de vous donner un objet DateTimeFormatInfo:

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

Il existe également des connaissances internes selon lesquelles toute interface IFormatProvider est probablement mise en œuvre par une classe qui descend de CultureInfo ou de DateTimeFormatInfo, de sorte que vous pouvez directement convertir l'interface:

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

Mais ne fais pas ça

Tout ce dur travail a déjà été écrit pour vous:

Pour obtenir un DateTimeFormatInfo à partir d'un IFormatProvider:

DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);

Pour obtenir un NumberFormatInfo à partir d'un IFormatProvider:

NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);

La valeur de IFormatProvider est que vous créez vos propres objets de culture. Tant qu'ils implémentent IFormatProvider et renvoient les objets qui leur sont demandés, vous pouvez contourner les cultures intégrées.

Vous pouvez également utiliser IFormatProvider pour passer des objets de culture arbitraires - par le biais de IFormatProvider. Par exemple. le nom de dieu dans différentes cultures

  • dieu
  • Dieu
  • Jéhovah
  • Yahwe
  • יהוה
  • יה אשר אהיה

Cela permet à votre classe personnalisée LordsNameFormatInfo de naviguer à l'intérieur d'un IFormatProvider, et vous pouvez conserver l'idiome.

En réalité, vous n'aurez jamais besoin d'appeler vous-même la méthode GetFormat de IFormatProvider.

Chaque fois que vous avez besoin d'un IFormatProvider, vous pouvez passer un objet CultureInfo:

DateTime.Now.ToString(CultureInfo.CurrentCulture);

endTime.ToString(CultureInfo.InvariantCulture);

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

Note: Tout code est publié dans le domaine public. Aucune attribution requise.

41
Ian Boyd

Transmettre null en tant que IFormatProvider n'est pas la bonne façon de procéder. Si l'utilisateur a un format de date/heure personnalisé sur son PC, vous rencontrerez des problèmes d'analyse et de conversion en chaîne. Je viens de corriger un bogue dans lequel quelqu'un avait passé la valeur null en tant que IFormatProvider lors de la conversion en chaîne.

Au lieu de cela, vous devriez utiliser CultureInfo.InvariantCulture

Faux:

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

Correct:

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

Vous pouvez voir ici http://msdn.Microsoft.com/en-us/library/system.iformatprovider.aspx

Voir les remarques et la section des exemples ici.

5
Aamir

IFormatProvider fournit des informations sur la culture à la méthode en question. DateTimeFormatInfo implémente IFormatProvider et vous permet de spécifier le format d'affichage de votre date/heure. Des exemples figurent sur les pages MSDN correspondantes.

5
Raithlin
2
tehvan

Par MSDN

Le .NET Framework inclut les implémentations suivantes de trois prédéfinies IFormatProvider afin de fournir des informations spécifiques à la culture utilisées dans le formatage ou l'analyse de valeurs numériques et de date et heure:

  1. La classe NumberFormatInfo fournit des informations permettant de formater des nombres, tels que les symboles de devise, de séparateur de milliers et de séparateur décimal, pour une culture donnée. Pour plus d'informations sur les chaînes de format prédéfinies reconnues par un objet NumberFormatInfo et utilisées dans les opérations de formatage numériques, voir Chaînes de format numérique standard et Chaînes de format numérique personnalisées.
  2. La classe DateTimeFormatInfo fournit des informations utilisées pour formater les dates et les heures, telles que les symboles séparateurs de date et d'heure pour une culture particulière ou l'ordre et le format des composants année, mois et jour d'une date. Pour plus d'informations sur les chaînes de format prédéfinies reconnues par un objet DateTimeFormatInfo et utilisées dans les opérations de formatage numériques, voir Chaînes de format standard à la date et à l'heure et Chaînes de format personnalisées à la date et à l'heure.
  3. La classe CultureInfo, qui représente une culture particulière. Sa méthode GetFormat renvoie un objet NumberFormatInfo ou DateTimeFormatInfo propre à la culture, selon que l'objet CultureInfo est utilisé dans une opération de formatage ou d'analyse comportant des nombres. ou dates et heures.

Le .NET Framework prend également en charge la mise en forme personnalisée. Cela implique généralement la création d'une classe de formatage qui implémente à la fois IFormatProvider et ICustomFormatter. Une instance de cette classe est ensuite transmise en tant que paramètre à une méthode qui effectue une opération de mise en forme personnalisée, telle que String.Format(IFormatProvider, String, Object[]).

2
Bigeyes

La classe DateTimeFormatInfo implémente cette interface. Elle vous permet donc de contrôler le formatage de vos chaînes DateTime.

1
Gerrie Schenck