2009-06-24 4 views
8

Wer weiß, wie ein Format-String in .NET zu konstruieren, so dass die resultierenden Zeichenfolge, die einen Doppelpunkt enthält?Ausstrahlen von einem Doppelpunkt über Format-String in .NET

Im Detail habe ich einen Wert, sagen wir 200, dass I als Verhältnis zu formatieren, das heißt "1: 200". Also konstruiere ich eine Formatzeichenkette wie diese "1: {0: N0}", die gut funktioniert. Das Problem ist, ich will Null als „0“ angezeigt wird, nicht „1: 0“, so mein Format-String sollte etwas sein wie „{0: 1: N0 ;; N0}“, aber natürlich dies nicht funktioniert.

Irgendwelche Ideen? Vielen Dank!

+0

Vielen Dank für die Antworten so weit. Ich sollte darauf hinweisen, dass ich weiß, dass ich bedingte Formatierungen wie vorgeschlagen ausführen kann, aber ich brauche tatsächlich eine einzelne Formatzeichenkette - zum Beispiel für eine ganze Datenspalte. – user7239

Antwort

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

gibt

1:4 
0 
-1:200 

Der ; Separator in Formatstrings bedeutet ‚tun positive Zahlen wie folgt aus; negative Zahlen wie diese; und Null so '. Die \ entkommt dem Doppelpunkt. Die dritte \ ist nicht streng notwendig, da ein Literal Null ist das gleiche wie die Standard-Zahlenformat-Ausgabe für Null :)

+1

Schön. Ich hatte das ';' Syntax vorher. –

+2

Ah, perfekt - es ist das String-Literal, das wir vermissten - wir hatten tatsächlich versucht, den Doppelpunkt zu entsichern, aber natürlich kompiliert das nicht ohne @ -Zeichnung der Zeichenfolge. Prost AakashM. – user7239

+0

Ausgezeichnete Antwort! –

1

Wie wäre es damit:

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

Nun, ein Weg, um es in einem if-Anweisung zu setzen, und es anders formatiert werden, wenn es Null ist.

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

Sie können die Lösung von AakashM verwenden. Wenn Sie etwas leicht lesbarer möchten, können Sie Ihren eigenen Provider erstellen:

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 
} 

Mit diesem Provider können Sie sehr lesbaren Format Strings erstellen:

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

Wenn Sie die Klasse steuern (und nicht formatiert als ein primitiver wie Int32), können Sie dies schöner aussehen lassen. Weitere Informationen finden Sie unter this article.

+0

Ich habe gerade keinen Compiler, also kann ich es nicht testen, aber ich nehme an, Sie könnten es auch als eine Erweiterungsmethode schreiben? So etwas wie "String.FormatRatio (..)"? –

+0

Das könnte man auch so machen. Jemnery gab gerade an, dass er einen Format-String-Ansatz wollte. –

Verwandte Themen