14857


String.Formatメソッドの書式指定には方法がたくさんあり、いつもmsdnなどのサイトを確認しています。  
下記の`"{0}"`が書式指定にあたりますが、

[code]

    String.Format("{0}", message);
    
[/code]

理解するための覚え方、チートシートなどを教えてください。


CC BY-SA 3.0
2015-08-25T12:28:41.420
14833
2015-08-29T01:43:26.230
2015-08-26T08:11:12.073
4236
8870
question
c# .net
String.Format メソッドの書式指定の概要を教えてください


自己解答します。  
string.Format の書式指定は、複合書式指定と呼ばれています。  
[MSDNでの解説](https://msdn.microsoft.com/ja-
jp/library/txafckwd%28v=vs.110%29.aspx)がありますが、網羅的に書かれているため簡単に理解するためには向いていないと思うので、簡単にまとめます。

{インデックス[,アライメント][:フォーマット]}  
という形式になっています。（[]内は省略可能です）  
要点と覚え方としては、以下のものが挙げられます。

  * インデックスは0始まり＝通常の配列と同じ
  * カンマ`,`は桁数を表す＝桁区切りの記号と同じ(1,000など)
  * コロン`:`はフォーマット＝内容を表す記号と同じ(X:fooなど)
  * 型によってフォーマットの書き方が変わる

フォーマットに指定するのは、数値型や日付型などで変わりますが、よく使われる数値型のみ覚えておけばいいと思います。

  * D 単純な数値(1000など)
  * N 桁区切り付きの数値(1,000など)
  * X 16進(FF00など)
  * F 小数点数(3.14など)

チートシートは英語のものが[たくさん見つかりました](https://www.google.co.jp/webhp?hl=ja#hl=ja&q=c%23+string+cheatsheet)が、日本語のものは見つけられませんでした。

よくまとめられていたサイトを挙げます。  
<http://blog.stevex.net/string-formatting-in-csharp/>


CC BY-SA 3.0
2015-08-25T12:28:41.420
14834
2015-08-29T01:43:26.230
2015-08-29T01:43:26.230
8870
8870
14833
answer


.NETのString.Format()とC言語のprintf()と対比して説明します。

  * String.Format()の書式 
    * `{index[,alignment][:formatString]}`
  * printf()の書式 
    * `%[flags][width][.precision]type`

で`alignment`と`formatString`、`flags`と`width`と`precision`はそれぞれ省略可能です。

String.Format()の`formatString`とprintf()の`type`のうち
`d`、`x`、`X`、`e`、`E`、`f`、`F`は同じ挙動をします。  
String.Format()の`alignment`とprintf()の`width`は同じ意味合いを持ちます。  
数値に限定すればString.Format()の`formatString`には数値を後続させることができ、printf()の`precision`と同じです。  
そのため

[code]

    Console.Write("{0,10:d5}\n", 1234);
    printf("%10.5d\n", 1234);
    
[/code]

は同じ結果を得られます。

* * *

String.Format()は引数にIFormatProviderを受け取るオーバーロードが用意されています。受け取らないオーバーロードの場合は現在のスレッドのカルチャを使用します。いずれにしても指定されたカルチャに応じた出力が得られます。  
例えば

[code]

    Thread.CurrentThread.CurrentCulture = new CultureInfo("ja-JP");
    Console.WriteLine("{0:N}", 1234.5678);
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    Console.WriteLine("{0:N}", 1234.5678);
    
[/code]

は、小数点や桁区切りが影響を受け

> 1,234.57  
>  1.234,57

となります。

* * *

以上は数値に限定して説明しましたが、その他に列挙型（enum）、DateTime型、TimeSpan型（.NET 4以降）にも対応しています。  
また`formatString`はアルファベット１文字で表現される標準の書式の他に複数文字で表現するカスタム書式も用意されています。もちろんこれらもカルチャに応じた結果が得られます。  
例えばDateTime型のカスタム書式を用いて

[code]

    Console.WriteLine("{0:yyyy/MM/dd}", DateTime.Now);
    
[/code]

といったこともできます。（得られる文字列に使われる日付区切り記号は`/`とは限りません。）詳細はMSDNドキュメントを参照してください。

  * [数値の標準書式](https://msdn.microsoft.com/ja-jp/library/dwhawy9k\(v=vs.110\).aspx)
  * [数値のカスタム書式](https://msdn.microsoft.com/ja-jp/library/0c899ak8\(v=vs.110\).aspx)
  * [列挙型の書式](https://msdn.microsoft.com/ja-jp/library/c3s1ez6e\(v=vs.110\).aspx)
  * [DateTime型の標準書式](https://msdn.microsoft.com/ja-jp/library/az4se3k1\(v=vs.110\).aspx)
  * [DateTime型のカスタム書式](https://msdn.microsoft.com/ja-jp/library/8kb3ddd4\(v=vs.110\).aspx)
  * [TimeSpan型の標準書式](https://msdn.microsoft.com/ja-jp/library/ee372286\(v=vs.110\).aspx)
  * [TimeSpan型のカスタム書式](https://msdn.microsoft.com/ja-jp/library/ee372287\(v=vs.110\).aspx)


CC BY-SA 3.0
2015-08-26T06:13:17.677
14857
2015-08-26T08:41:27.880
2015-08-26T08:41:27.880
4236
4236
14833
answer