2009-06-24 2 views
8

Est-ce que quelqu'un sait comment construire une chaîne de format dans .NET de sorte que la chaîne résultante contienne un deux-points?Émission d'un deux-points via une chaîne de format dans .NET

En détail, j'ai une valeur, disons 200, que j'ai besoin de mettre en forme en tant que rapport, c'est-à-dire "1: 200". Donc je construis une chaîne de format comme ceci "1: {0: N0}" qui fonctionne bien. Le problème est que je veux zéro pour afficher "0", pas "1: 0", donc ma chaîne de format devrait être quelque chose comme "{0: 1: N0 ;; N0}", mais bien sûr cela ne fonctionne pas.

Des idées? Merci!

+0

Merci pour les réponses à ce jour. Je dois souligner que je sais que je pourrais faire un certain formatage conditionnel comme suggéré, mais j'ai réellement besoin d'une chaîne de format unique - par exemple pour appliquer à une colonne entière de données. – user7239

Répondre

15
using System; 

namespace ConsoleApplication67 
{ 
    class Program 
    { 
     static void Main() 
     { 
      WriteRatio(4); 
      WriteRatio(0); 
      WriteRatio(-200); 

      Console.ReadLine(); 
     } 

     private static void WriteRatio(int i) 
     { 
      Console.WriteLine(string.Format(@"{0:1\:0;-1\:0;\0}", i)); 
     } 
    } 
} 

donne

1:4 
0 
-1:200 

Le séparateur ; dans les chaînes de format signifie « faire des nombres positifs comme celui-ci; nombres négatifs comme ceci; et zéro comme ça '. Le \ échappe au côlon. Le troisième \ n'est pas strictement nécessaire comme zéro littéral est le même que la sortie de format numérique standard pour zéro :)

+1

Nice. Je n'avais pas vu le ';' syntaxe avant. –

+2

Ah, parfait - c'est le littéral de chaîne qui nous manquait - nous aurions essayé d'esacaping le deux-points mais bien sûr cela ne compile pas sans @ -ing la chaîne. À la vôtre AakashM. – user7239

+0

Excellente réponse! –

1

Que diriez-vous ceci:

String display = (yourValue == 0) ? "0" : String.Format("1:{0:N0}", yourValue); 
0

Eh bien, d'une façon est de le mettre dans une instruction if, et formater différemment si elle est égale à zéro.

1
String.Format(n==0 ? "{0:NO}" : "1:{0:NO}",n); 
3

Vous pouvez utiliser la solution AakashM. Si vous voulez quelque chose un peu plus lisible, vous pouvez créer votre propre fournisseur:

internal class RatioFormatProvider : IFormatProvider, ICustomFormatter 
{ 
    public static readonly RatioFormatProvider Instance = new RatioFormatProvider(); 
    private RatioFormatProvider() 
    { 

    } 
    #region IFormatProvider Members 

    public object GetFormat(Type formatType) 
    { 
     if(formatType == typeof(ICustomFormatter)) 
     { 
      return this; 
     } 

     return null; 
    } 

    #endregion 

    #region ICustomFormatter Members 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     string result = arg.ToString(); 

     switch(format.ToUpperInvariant()) 
     { 
      case "RATIO": 
       return (result == "0") ? result : "1:" + result; 
      default: 
       return result; 
     } 
    } 

    #endregion 
} 

Avec ce fournisseur, vous pouvez créer des chaînes de format très lisible:

int ratio1 = 0; 
int ratio2 = 200; 
string result = String.Format(RatioFormatProvider.Instance, "The first value is: {0:ratio} and the second is {1:ratio}", ratio1, ratio2); 

Si vous contrôlez la classe en cours de formatage (plutôt que celui qui est primitif comme Int32), vous pouvez rendre ce look plus agréable. Voir this article pour plus de détails.

+0

Je n'ai pas de compilateur pour le moment, donc je ne peux pas le tester, mais je suppose que vous pouvez aussi l'écrire comme une méthode d'extension? Quelque chose comme "String.FormatRatio (..)"? –

+0

Vous pourriez certainement le faire de cette façon aussi. Jemnery vient d'indiquer qu'il voulait une approche par chaîne de format. –

Questions connexes