Qu'est-ce IFormatProvider faire?
-
21-08-2019 - |
Question
Je jouais avec la méthode Datetime.ParseExact, et il veut un IFormatProvider ...
Il fonctionne l'entrée nulle, mais qu'est-ce exactement il faire?
La solution
En plus de la réponse de Ian Boyd:
Aussi implémente cette interface CultureInfo
et peut être utilisé dans votre cas. Ainsi, vous pouvez analyser une chaîne de date française par exemple; vous pouvez utiliser
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
Autres conseils
L'interface est normalement mis en œuvre IFormatProvider
pour vous par une classe de CultureInfo
, par exemple:.
-
CultureInfo.CurrentCulture
-
CultureInfo.CurrentUICulture
-
CultureInfo.InvariantCulture
-
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
L'interface est une passerelle pour une fonction pour obtenir un ensemble de données spécifiques à la culture d'une culture. Les deux objets culture couramment disponibles que peut être un DateTimeFormatInfo
interrogé pour sont:
-
NumberFormatInfo
-
LordsNameFormatInfo
La façon dont il est normalement vous demander de travailler le pour vous donner GetFormat
un objet <=>:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Il y a aussi des connaissances à l'intérieur que toute interface est <=> mise en œuvre probablement par une classe qui descend de <=> ou descend de <=>, de sorte que vous pourriez lancer l'interface directement:
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 le faites pas
Tout ce travail a déjà été écrit pour vous:
Pour obtenir un <=> d'un <=> :
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Pour obtenir un <=> d'un <=> :
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
La valeur de est que vous <=> créer vos propres objets de culture. Tant qu'ils mettent en œuvre <=>, et le retour des objets qu'ils demandaient, vous pouvez contourner le intégré dans les cultures.
Vous pouvez également utiliser un moyen <=> de passer des objets de la culture arbitraire - par la <=>. Par exemple. le nom de Dieu dans les différentes cultures
- dieu
- Dieu
- Jehova
- Yahwe
- יהוה
- אהיה אשר אהיה
Cela permet ainsi à l'intérieur d'un tour de classe <=> votre commande <=>, et vous pouvez préserver l'idiome.
En réalité, vous aurez jamais besoin d'appeler la méthode de vous-même <=> <=>.
Chaque fois que vous avez besoin d'un <=> vous pouvez passer un objet <=>:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Remarque : Tout code est libéré dans le domaine public. Aucune attribution requise.
Passage null comme n'est pas la IFormatProvider
bonne façon de le faire. Si l'utilisateur a une date personnalisée / format de l'heure sur leur PC, vous aurez des problèmes dans l'analyse et la conversion en chaîne. Je viens Correction d'un bug quelqu'un avait passé null comme IFormatProvider lors de la conversion en chaîne.
Au lieu de cela, vous devez utiliser CultureInfo.InvariantCulture
Mauvais:
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);
Vous pouvez voir ici http://msdn.microsoft.com/ fr-fr / bibliothèque / system.iformatprovider.aspx
Voir la section des remarques et exemple là.
IFormatProvider fournit des informations de culture à la méthode en question. DateTimeFormatInfo implémente IFormatProvider et vous permet de spécifier le format vous voulez que votre date / heure à afficher dans. des exemples peuvent être trouvés dans les pages MSDN pertinents.
Vérifier http://msdn.microsoft.com/en- nous / bibliothèque / system.iformatprovider.aspx pour l'API.
Le .NET Framework comprend les éléments suivants trois implémentations prédéfinies IFormatProvider pour fournir des informations spécifiques à la culture qui est utilisée dans la mise en forme ou de l'analyse des valeurs numériques et la date et l'heure:
- La classe
NumberFormatInfo
, qui fournit des informations qui sont utilisées à des numéros de format, tels que la monnaie, séparateur de milliers, et les symboles de séparateur décimal pour une culture particulière. Pour plus d'informations sur les chaînes de format prédéfinies reconnues par un objet et utilisés dansDateTimeFormatInfo
opérations de mise en forme numérique, consultez Chaînes de format numérique standard et chaînes de format numérique personnalisé. - La
CultureInfo
classe, qui fournit des informations qui est utilisé pour les dates et heures format, telles que la date et les symboles de séparation temps pour une culture ou l'ordre et le format de l'année, le mois et les composants de jour d'une date. Pour plus d'informations sur les chaînes de format prédéfinies reconnues par un objet et utilisés dansGetFormat
opérations de mise en forme numérique, voir la date et le format standard du temps et des chaînes Date personnalisée et chaînes de format de l'heure. - La classe
String.Format(IFormatProvider, String, Object[])
, ce qui représente une culture particulière. Sa méthode retourne un <=> objet ou <=> spécifique à la culture <=>, selon que l'objet est utilisé dans <=> un formatage ou une opération qui implique l'analyse des chiffres ou des 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 les deux IFormatProvider et ICustomFormatter. On fait ensuite passer une instance de cette classe en tant que paramètre à un procédé qui effectue une opération de mise en forme personnalisée, comme <=>.
La classe DateTimeFormatInfo implémente cette interface, il vous permet de contrôler la mise en forme de vos chaînes de DateTime.