80 votes

String.Format - comment ça marche et comment implémenter des chaînes de format personnalisées

Avec String.Format() il est possible de mettre par exemple DateTime des objets de différentes façons. Chaque fois que je suis à la recherche d'un format de votre choix, j'ai besoin de chercher partout sur Internet. Presque toujours je trouver un exemple que je peux utiliser. Par exemple:

String.Format("{0:MM/dd/yyyy}", DateTime.Now);          // "09/05/2012"

Mais je n'ai pas la moindre idée de comment il fonctionne et quelles classes de soutien de ces "magique" d'autres chaînes.

Donc mes questions sont:

  1. Comment est - String.Format carte les informations supplémentaires MM/dd/yyyy d'une chaîne de résultat?
  2. Ne Microsoft tous les objets prennent en charge cette fonctionnalité?
    Est-ce documenté quelque part?
  3. Est-il possible de faire quelque chose comme ceci:
    String.Format("{0:MyCustomFormat}", new MyOwnClass())

89voto

yamen Points 9976

String.Format correspond à chacun des jetons à l'intérieur de la chaîne ({0} etc) à l'encontre de l'objet correspondant: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

Une chaîne de format est fournies en option:

{ index[,alignment][ : formatString] }

Si formatString est fourni, l'objet correspondant doit mettre en œuvre IFormattable et plus précisément l' ToString méthode qui accepte formatString et renvoie le correspondant de la chaîne mise en forme: http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx

Un IFormatProvider peut également utilisées, ce qui peut être utilisé pour capturer la mise en forme de base de normes/valeurs par défaut etc. Des exemples ici et ici.

Ainsi les réponses à vos questions dans l'ordre:

  1. Il utilise l' IFormattable interface de l' ToString() méthode sur l' DateTime objet et le passe à l' MM/dd/yyyy chaîne de format. C'est que la mise en œuvre qui renvoie la chaîne correcte.

  2. N'importe quel objet que de mettre en œuvre IFormattable prend en charge cette fonctionnalité. Vous pouvez même écrire votre propre!

  3. Oui, voir ci-dessus.

20voto

Dean Thomas Points 682

À ma connaissance, vous auriez besoin de mettre en œuvre IFormattable dans votre classe pour prendre en charge cela. Cela a alors la méthode, ToString qui prend les paramètres que vous passez dans String.Format.

Voici un exemple.

 // Define other methods and classes here
public class Sample : IFormattable
{
     public string ToString(string format, IFormatProvider provider)
     {
         return String.Concat("Your custom format was ", format);
     }
}

String.Format("{0:MyCustomFormat}", new Sample())
 

5voto

Steve Haigh Points 6261
  1. Vérifier l'officiel MSDN docs, il y a une liste complète de DateTime chaînes de format ici: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx. Il y a en effet tout à fait un peu "magique" des chaînes.

  2. Comme je sais que pas tous les types de "intéressant" mise en forme, mais à tous les types de support ToString(). Si vous avez besoin de formater un construit en objet, vous pouvez ajouter une extension de la méthode pour le faire, mais généralement mise en forme est fournie dans tout endroit où il est nécessaire (ou pour le dire d'une autre façon, j'ai seulement écrit formateurs personnalisés pour mes propres types).

  3. Oui, vous pouvez écrire votre propre, et si vous avez des données qui peuvent être mises en forme différentes façons que vous devriez probablement écrire une mise en forme personnalisée, par la mise en œuvre de IFormattable, de nouveau voir les docs ici: http://msdn.microsoft.com/en-us/library/system.iformattable.aspx. C'est assez simple, il vous suffit de cocher les cordes fournies et écrire vos données sur la base de ces, il n'y a pas de magie derrière les coulisses:-)

4voto

M Afifi Points 2262

Sous les couvertures de la Chaîne.Format fait quelque chose comme suit,

IFormattable formattable = objectToFormat as IFormattable;
if (formattable != null)
{
    formattable.ToString(objectToFormat);
}
else
{
    objectToFormat.ToString();
}

Pour vos questions,

  1. Comment fonctionne la Chaîne.Format de la carte les informations supplémentaires MM/jj/aaaa pour une chaîne de résultat?

    Comme indiqué ci-dessus, il se contente d'appeler la IFormattable .ToString(string format, IFormatProvider fournisseur). Le fournisseur est souvent quelque chose qui vous dit que la culture est de votre système. Souvent nul parce que les gens ne le transmettent pas de Chaîne.Format() comme vous l'avez fait dans votre cas.

  2. Ne microsoft tous les objets prennent en charge cette fonctionnalité? Est-ce documenté quelque part?

    Tout ce qui implémente IFormattable.

  3. Est-il possible de faire quelque chose comme ceci: String.Format("{0:MyCustomFormat}, new MyOwnClass())

    Essentiellement, si vous voulez votre propre objet de faire quelque chose avec le format à condition de mettre en oeuvre IFormattable.

Il existe un grand nombre de classes de support et d'enquêteurs pour s'assurer cependant que les chaînes de format sont en grande partie similaires. De plus ici.

0voto

Maciej Points 3666

Oui, c'est possible - cela peut être complètement personnalisé. Regardez ce lien de documentation sur le formatage personnalisé de date et heure.

Si vous avez votre propre objet, c'est à vous de remplacer la méthode ToString() et d'afficher ce que vous jugez être une représentation appropriée. Une fois que vous faites cela, vous pouvez utiliser String.Format("{0:MyCustomFormat}", new MyOwnClass()) car cela appelle implicitement MyOwnClass.ToString()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X