String.Format メソッドの書式指定の概要を教えてください


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

[code]

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

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




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




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

