2009-06-24 7 views
8

結果文字列にコロンが含まれるように、フォーマット文字列を.NETで構築する方法を知っている人はいますか?.NETでフォーマット文字列を使用してコロンを出力

具体的には、比率としてフォーマットする必要がある値、たとえば「200:200」があります。だから、私はこの "1:{0:N0}"のようなフォーマット文字列を作成しています。これはうまく動作します。問題は、私のフォーマット文字列が "{0:1:N0 ;; N0}"のようなものでなければならないので、 "0"ではなく "0"として表示することですが、もちろんこれは動作しません。

アイデア?ありがとう!これについて

+0

これまでの回答に感謝します。私は示唆しているようにいくつかの条件付き書式設定を行うことができますが、実際にはデータの列全体に適用するなど、単一の書式設定文字列が必要であることを指摘しておきます。 – user7239

答えて

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

は、書式指定文字列で;セパレータは「という意味。このような正の数を行う

1:4 
0 
-1:200 

与えます。このような負の数。このようなゼロ。 \はコロンをエスケープします。 3番目の\であり、厳密にはではありません。リテラルゼロは0の標準数値形式出力と同じです。

+1

ニース。私は ';'前に構文。 –

+2

ああ、完璧です - それは私たちが見逃していた文字列リテラルです - 実際にはコロンをエスケープしてみましたが、もちろん文字列の@を付けずにはコンパイルできません。乾杯AakashM。 – user7239

+0

優れた答え! –

1

方法:

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

まあ、一つの方法は、if文の中に入れて、それがゼロであれば、異なる書式を設定することです。

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

あなたはAakashMのソリューションを使用できます。あなたはクラスがフォーマットされてコントロールしている場合ではなく(

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

:あなたは非常に読みやすい形式の文字列を作成することができ、このプロバイダとの

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 
} 

:あなたはもう少し読みやすい何かをしたい場合は、独自のプロバイダを作成することができますInt32のような基本的なものよりも)、これをより良く見せることができます。詳細はthis articleを参照してください。

+0

私は今コンパイラを持っていないので、私はそれをテストすることはできませんが、あなたはまた、拡張メソッドとして書くことができると思いますか? "String.FormatRatio(..)"のようなもの? –

+0

あなたは確かにそうすることもできます。 jemneryはちょうど彼がフォーマット文字列のアプローチを望んでいることを示しました。 –

関連する問題