J'essayais de créer une implémentation IFormatProvider
qui reconnaîtrait les chaînes de format personnalisées pour les objets DateTime. Voici mon implémentation:Comment créer et utiliser un IFormatProvider personnalisé pour DateTime?
public class MyDateFormatProvider : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
{
return this;
}
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if(arg == null) throw new ArgumentNullException("arg");
if (arg.GetType() != typeof(DateTime)) return arg.ToString();
DateTime date = (DateTime)arg;
switch(format)
{
case "mycustomformat":
switch(CultureInfo.CurrentCulture.Name)
{
case "en-GB":
return date.ToString("ddd dd MMM");
default:
return date.ToString("ddd MMM dd");
}
default:
throw new FormatException();
}
}
Je comptais pouvoir l'utiliser dans la méthode DateTime.ToString(string format, IFormatProvider provider)
comme si, mais:
DateTime d = new DateTime(2000, 1, 2);
string s = d.ToString("mycustomformat", new MyDateFormatProvider());
Dans cet exemple, en cours d'exécution dans la culture des États-Unis, le résultat est "00cu0Ao00or0aA"
, apparemment parce que les chaînes de format DateTime standard sont interprétées.
Cependant, lorsque j'utilise la même classe de la manière suivante:
DateTime d = new DateTime(2000, 1, 2);
string s = String.Format(new MyDateFormatProvider(), "{0:mycustomformat}", d);
Je reçois ce que je pense, à savoir "Sun Jan 02"
Je ne comprends pas les différents résultats. Quelqu'un pourrait-il expliquer?
Merci!
Merci pour la réponse détaillée. Je pensais que j'avais mal compris l'interface et l'implémentation attendue, donc c'est bon de savoir que c'est l'implémentation de DateTime qui est loufoque :-) –