2010-11-13T02:45:43の更新内容

programming/netfx/string/3_formatting/index.wiki.txt

current previous
7,88 7,36
 

                

                
 
ここでは、文字列の書式化、.NET Frameworkでサポートされている書式指定子、書式指定子とフォーマット例、および関連するクラス・インターフェイス等について見ていきます。
ここでは、文字列の書式化、.NET Frameworkでサポートされている書式指定子、書式指定子とフォーマット例、および関連するクラス・インターフェイス等について見ていきます。
 

                

                
+
なお、以下のサンプルではカルチャによっては異なる結果となる箇所がありますが、特に断りのない限りja-JPの環境で実行した結果について述べています。 カルチャと書式については以下の文書も参照してください。
+

                  
 
-関連するページ
-関連するページ
 
#ls2_1(programming/netfx/locale,pathsort)
#ls2_1(programming/netfx/locale,pathsort)
 

                

                
 
#googleadunit(rect)
#googleadunit(rect)
 

                

                
 
*書式指定子の概要
*書式指定子の概要
~
**書式化に対応したメソッドと書式指定子
基本型のToString()、&msdn(netfx,method,System.Console.WriteLine){Console.WriteLine()};、&msdn(netfx,method,System.String.Format){String.Format()};などのメソッドは、値を文字列化する際に値の書式(フォーマット)を指定することができます。 .NET Frameworkでは、これらの書式は書式指定子として定義されています。
+
基本型のToString、&msdn(netfx,method,System.Console.WriteLine){Console.WriteLine};、&msdn(netfx,method,System.String.Format){String.Format};などのメソッドは、値を文字列化する際に値の書式(フォーマット)を指定することができます。 .NET Frameworkでは、これらの書式は書式指定子として定義されています。 書式指定子を使用することで、有効桁数やゼロ埋めなどを指定して値を文字列化することが出来ます。
 

                

                
+
#tabpage(C#)
 
#code(cs,数値に書式を指定した例){{
#code(cs,数値に書式を指定した例){{
~
using System;
double doubleValue = 3.1416;
+

                  
+
class Sample
+
{
+
  static void Main()
+
  {
+
    double doubleValue = 3.141592654;
 

                

                
~
    Console.WriteLine(doubleValue.ToString());
Console.WriteLine(doubleValue.ToString());
~
    Console.WriteLine(doubleValue.ToString("N3"));
Console.WriteLine(doubleValue.ToString("N2"));
~
    Console.WriteLine(doubleValue.ToString("###.000000"));
Console.WriteLine(doubleValue.ToString("###.000000"));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb,数値に書式を指定した例){{
+
Imports System
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Dim doubleValue As Double = 3.141592654
+

                  
+
    Console.WriteLine(doubleValue.ToString())
+
    Console.WriteLine(doubleValue.ToString("N3"))
+
    Console.WriteLine(doubleValue.ToString("###.000000"))
+
  End Sub
+
End Class
 
}}
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
~
3.141592654
3.1416
~
3.142
3.14
~
3.141593
3.141600
 
}}
}}
 

                

                
+
#tabpage(C#)
 
#code(cs,DateTime型に書式を指定する例){{
#code(cs,DateTime型に書式を指定する例){{
~
using System;
DateTime dateTimeValue = new DateTime(2010, 9, 14, 1, 2, 3);
 

                

                
~
class Sample
Console.WriteLine(dateTimeValue.ToString());
~
{
Console.WriteLine(dateTimeValue.ToString("r"));
~
  static void Main()
Console.WriteLine(dateTimeValue.ToString("s"));
~
  {
Console.WriteLine(dateTimeValue.ToString("yyyy/MM/dd (dddd) hh:mm:ss"));
+
    DateTime dateTimeValue = new DateTime(2010, 9, 14, 1, 2, 3);
+

                  
+
    Console.WriteLine(dateTimeValue.ToString());
+
    Console.WriteLine(dateTimeValue.ToString("r"));
+
    Console.WriteLine(dateTimeValue.ToString("s"));
+
    Console.WriteLine(dateTimeValue.ToString("yyyy/MM/dd (dddd) hh:mm:ss"));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb,DateTime型に書式を指定する例){{
+
Imports System
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Dim dateTimeValue As New DateTime(2010, 9, 14, 1, 2, 3)
+

                  
+
    Console.WriteLine(dateTimeValue.ToString())
+
    Console.WriteLine(dateTimeValue.ToString("r"))
+
    Console.WriteLine(dateTimeValue.ToString("s"))
+
    Console.WriteLine(dateTimeValue.ToString("yyyy/MM/dd (dddd) hh:mm:ss"))
+
  End Sub
+
End Class
 
}}
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
 
2010/09/14 1:02:03
2010/09/14 1:02:03
97,112 45,51
 
2010/09/14 (火曜日) 01:02:03
2010/09/14 (火曜日) 01:02:03
 
}}
}}
 

                

                
~
また、String.Formatメソッド、Console.WriteLineメソッドでは、複合書式設定を使って引数に適用する書式を個々に指定して文字列化することができます。
String.Format()メソッド、Console.WriteLine()メソッドでは、引数に適用する書式を個々に指定して文字列化することができます。
 

                

                
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
~
using System;
DateTime dateTimeValue = new DateTime(2010, 9, 14, 1, 2, 3);
-
double doubleValue = 3.1416;
-
int intValue = 72;
 

                

                
~
class Sample
Console.WriteLine("{0:hh:ss} {1:N2} {2:D4}", dateTimeValue, doubleValue, intValue);
+
{
+
  static void Main()
+
  {
+
    DateTime dateTimeValue = new DateTime(2010, 9, 14, 1, 2, 3);
+
    double doubleValue = 3.141592654;
+
    int intValue = 72;
 

                

                
~
    Console.WriteLine("{0:hh:ss} {1:N2} {2:D4}", dateTimeValue, doubleValue, intValue);
string formatted = string.Format("{0:hh:ss} {1:N2} {2:D4}", dateTimeValue, doubleValue, intValue);
 

                

                
~
    string formatted = string.Format("{0:hh:ss} {1:N2} {2:D4}", dateTimeValue, doubleValue, intValue);
Console.WriteLine(formatted);
+

                  
+
    Console.WriteLine(formatted);
+
  }
+
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Dim dateTimeValue As New DateTime(2010, 9, 14, 1, 2, 3)
+
    Dim doubleValue As Double = 3.141592654
+
    Dim intValue As Integer = 72
+

                  
+
    Console.WriteLine("{0:hh:ss} {1:N2} {2:D4}", dateTimeValue, doubleValue, intValue)
+

                  
+
    Dim formatted As String = String.Format("{0:hh:ss} {1:N2} {2:D4}", dateTimeValue, doubleValue, intValue)
+

                  
+
    Console.WriteLine(formatted)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
 
01:03 3.14 0072
01:03 3.14 0072
 
01:03 3.14 0072
01:03 3.14 0072
 
}}
}}
 

                

                
+
複合書式設定では書式のほか、右詰め・左詰めでのアラインメントを指定することも出来ます。
+

                  
 
**複合書式設定と0埋め・右揃え・左揃え
**複合書式設定と0埋め・右揃え・左揃え
 
複合書式設定を用いることで、0埋め(ゼロパディング)、右詰め(右揃え)・左詰め(左揃え)することができます。 (MSDN: &msdn(netfx,id,txafckwd){複合書式設定};)
複合書式設定を用いることで、0埋め(ゼロパディング)、右詰め(右揃え)・左詰め(左揃え)することができます。 (MSDN: &msdn(netfx,id,txafckwd){複合書式設定};)
 

                

                
 
複合書式設定の形式は次のようになっています。
複合書式設定の形式は次のようになっています。
 
 {index[,alignment][:formatString]}
 {index[,alignment][:formatString]}
~
:'''index'''|書式を適用する引数のインデックス
:index|書式を適用する引数のインデックス
~
:'''alignment'''|文字列化する際の幅(桁数) 文字列の長さが指定した幅より大きい場合は無視される(切り詰めない)
:alignment|文字列化する際の幅(桁数) 文字列の長さが指定した幅より大きい場合は無視される(切り詰めない)
 
::幅が正の場合|指定した幅で右揃えにする
::幅が正の場合|指定した幅で右揃えにする
 
::幅が負の場合|指定した幅で左揃えにする
::幅が負の場合|指定した幅で左揃えにする
~
:'''formatString'''|文字列化する際の書式
:formatString|文字列化する際の書式
 

                

                
~
'''index'''は必須、'''alignment'''と'''formatString'''は省略可能で組み合わせて指定することができます。 0埋めの際の書式(''D6''など)については後述します。
indexは必須、alignmentとformatStringは省略可能で組み合わせて指定することができます。 0埋めの際の書式(D6など)については後述します。
 

                

                
+
#tabpage(C#)
 
#code(cs,複合書式の例){{
#code(cs,複合書式の例){{
~
using System;
Console.WriteLine("|0123456789|");        // (桁取り)
~

                  
Console.WriteLine("|{0,10}|", 72);        // 数値を幅10で右揃え
~
class Sample
Console.WriteLine("|{0,-10}|", 42);       // 数値を幅10で左揃え
~
{
Console.WriteLine("|{0,10}|", "foo");     // 文字列を幅10で右揃え
~
  static void Main()
Console.WriteLine("|{0,-10}|", "bar");    // 文字列を幅10で左揃え
~
  {
Console.WriteLine("|{0,3}|", 16);         // 2桁の数値を幅3で右揃え
~
    Console.WriteLine("|0123456789|");        // (桁取り)
Console.WriteLine("|{0,3}|", 12345);      // 5桁の数値を幅3で右揃え
~
    Console.WriteLine("|{0,10}|", 72);        // 数値を幅10で右揃え
Console.WriteLine("|{0:D6}|", 16);        // 2桁の数値を0埋めして6桁に
~
    Console.WriteLine("|{0,-10}|", 42);       // 数値を幅10で左揃え
Console.WriteLine("|{0:D6}|", 12345);     // 5桁の数値を0埋めして6桁に
~
    Console.WriteLine("|{0,10}|", "foo");     // 文字列を幅10で右揃え
Console.WriteLine("|{0,10:D6}|", 16);     // 2桁の数値を0埋めして6桁にし、幅10で右揃え
~
    Console.WriteLine("|{0,-10}|", "bar");    // 文字列を幅10で左揃え
Console.WriteLine("|{0,-10:D6}|", 12345); // 5桁の数値を0埋めして6桁にし、幅10で左揃え
+
    Console.WriteLine("|{0,3}|", 16);         // 2桁の数値を幅3で右揃え
+
    Console.WriteLine("|{0,3}|", 12345);      // 5桁の数値を幅3で右揃え
+
    Console.WriteLine("|{0:D6}|", 16);        // 2桁の数値を0埋めして6桁に
+
    Console.WriteLine("|{0:D6}|", 12345);     // 5桁の数値を0埋めして6桁に
+
    Console.WriteLine("|{0,10:D6}|", 16);     // 2桁の数値を0埋めして6桁にし、幅10で右揃え
+
    Console.WriteLine("|{0,-10:D6}|", 12345); // 5桁の数値を0埋めして6桁にし、幅10で左揃え
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb,複合書式の例){{
+
Imports System
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("|0123456789|")         ' (桁取り)
+
    Console.WriteLine("|{0,10}|", 72)         ' 数値を幅10で右揃え
+
    Console.WriteLine("|{0,-10}|", 42)        ' 数値を幅10で左揃え
+
    Console.WriteLine("|{0,10}|", "foo")      ' 文字列を幅10で右揃え
+
    Console.WriteLine("|{0,-10}|", "bar")     ' 文字列を幅10で左揃え
+
    Console.WriteLine("|{0,3}|", 16)          ' 2桁の数値を幅3で右揃え
+
    Console.WriteLine("|{0,3}|", 12345)       ' 5桁の数値を幅3で右揃え
+
    Console.WriteLine("|{0:D6}|", 16)         ' 2桁の数値を0埋めして6桁に
+
    Console.WriteLine("|{0:D6}|", 12345)      ' 5桁の数値を0埋めして6桁に
+
    Console.WriteLine("|{0,10:D6}|", 16)      ' 2桁の数値を0埋めして6桁にし、幅10で右揃え
+
    Console.WriteLine("|{0,-10:D6}|", 12345)  ' 5桁の数値を0埋めして6桁にし、幅10で左揃え
+
  End Sub
+
End Class
+

                  
 
}}
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
 
|0123456789|
|0123456789|
218,37 105,12
 
|012345    |
|012345    |
 
}}
}}
 

                

                
+
次のように、複数の引数に対して個別に複合書式を指定することも出来ます。
+

                  
+
#tabpage(C#)
 
#code(cs,複数の引数に対する複合書式の例){{
#code(cs,複数の引数に対する複合書式の例){{
~
using System;
// 0番目の引数を0埋めして3桁に
~

                  
// 1番目の引数を幅5で左詰め
~
class Sample
// 2番目の引数を0埋めして3桁にし、幅5で右詰め
~
{
Console.WriteLine("|{0:D3}/{1,-5}/{2,5:D3}|", 72, 16, 42);
+
  static void Main()
+
  {
+
    // 0番目の引数を0埋めして3桁に
+
    // 1番目の引数を幅5で左詰め
+
    // 2番目の引数を0埋めして3桁にし、幅5で右詰め
+
    Console.WriteLine("|{0:D3}/{1,-5}/{2,5:D3}|", 72, 16, 42);
+
  }
+
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb,複数の引数に対する複合書式の例){{
+
Imports System
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    ' 0番目の引数を0埋めして3桁に
+
    ' 1番目の引数を幅5で左詰め
+
    ' 2番目の引数を0埋めして3桁にし、幅5で右詰め
+
    Console.WriteLine("|{0:D3}/{1,-5}/{2,5:D3}|", 72, 16, 42)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
 
|072/16   /  042|
|072/16   /  042|
256,35 118,12
 

                

                
 
中括弧そのものを出力したい場合は、"{{"や"}}"のように二つ重ねることでエスケープされ、"{"と"}"が出力されます。
中括弧そのものを出力したい場合は、"{{"や"}}"のように二つ重ねることでエスケープされ、"{"と"}"が出力されます。
 

                

                
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
~
using System;
Console.WriteLine("{0}}}", 72);
~

                  
Console.WriteLine("{{{0}", 16);
~
class Sample
Console.WriteLine("{{0:D6}}", 42);
~
{
Console.WriteLine("{{{0:D6}}}", 42);
+
  static void Main()
+
  {
+
    Console.WriteLine("{0}}}", 72);       // 閉じ中括弧をエスケープ
+
    Console.WriteLine("{{{0}", 16);       // 開き中括弧をエスケープ
+
    Console.WriteLine("{{0:D6}}", 42);    // 開き中括弧と閉じ中括弧をエスケープ (括弧の中は複合書式とはみなされない)
+
    Console.WriteLine("{{{0:D6}}}", 42);  // 開き中括弧と閉じ中括弧をエスケープし、間に複合書式を含める
+
  }
+
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("{0}}}", 72)        ' 閉じ中括弧をエスケープ
+
    Console.WriteLine("{{{0}", 16)        ' 開き中括弧をエスケープ
+
    Console.WriteLine("{{0:D6}}", 42)     ' 開き中括弧と閉じ中括弧をエスケープ (括弧の中は複合書式とはみなされない)
+
    Console.WriteLine("{{{0:D6}}}", 42)   ' 開き中括弧と閉じ中括弧をエスケープし、間に複合書式を含める
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
 
72}
72}
294,43 133,17
 
}}
}}
 

                

                
 
*標準の書式指定文字列
*標準の書式指定文字列
~
標準の書式指定子とはあらかじめ定義された書式を ''D'', ''N'', ''r'' などの文字で表すもので、書式指定子と桁数などの数値と組み合わせた書式指定文字列を指定することでさまざまな形式にフォーマットすることができます。
標準の書式指定子とはあらかじめ定義された書式を'D', 'N', 'r'などの文字で表すもので、書式指定子と桁数などの数値と組み合わせた書式指定文字列を指定することでさまざまな形式にフォーマットすることができます。
 

                

                
+
#tabpage(C#)
 
#code(cs,整数・日時と書式指定文字列の例){{
#code(cs,整数・日時と書式指定文字列の例){{
~
using System;
int intValue = 72;
+

                  
+
class Sample
+
{
+
  static void Main()
+
  {
+
    int intValue = 72;
+

                  
+
    Console.WriteLine("{0:D}   {0:D4}   {0:N4}", intValue);
+

                  
+
    DateTime dateTimeValue = new DateTime(2010, 9, 14, 1, 2, 3);
+

                  
+
    Console.WriteLine("{0}   {0:r}   {0:s}", dateTimeValue);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb,整数・日時と書式指定文字列の例){{
+
Imports System
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Dim intValue As Integer = 72
 

                

                
~
    Console.WriteLine("{0:D}   {0:D4}   {0:N4}", intValue)
Console.WriteLine("{0:D}   {0:D4}   {0:N4}", intValue);
 

                

                
~
    Dim dateTimeValue As New DateTime(2010, 9, 14, 1, 2, 3)
DateTime dateTimeValue = new DateTime(2010, 9, 14, 1, 2, 3);
 

                

                
~
    Console.WriteLine("{0}   {0:r}   {0:s}", dateTimeValue)
Console.WriteLine("{0}   {0:r}   {0:s}", dateTimeValue);
+
  End Sub
+
End Class
 
}}
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
 
72   0072   72.0000
72   0072   72.0000
352,15 165,7
 
|(72).ToString("D4")|"0072"|
|(72).ToString("D4")|"0072"|
 
|(72).ToString("d4")|"0072"|
|(72).ToString("d4")|"0072"|
 
|(-72).ToString("D")|"-72"|
|(-72).ToString("D")|"-72"|
~
|(-72).ToString("D4")|"-0072"|
|(-72)72.ToString("D4")|"-0072"|
+
なお、ローカライズされた形式でフォーマットされるため、以下の例に挙げたカルチャ以外ではマイナス記号や空白などが挿入される位置が異なる場合がある点には注意が必要。
+
|*書式指定子"D", "d"とローカライズの例
+
|~値と書式指定子|~結果|h
+
|(-16).ToString("D4", CultureInfo.GetCultureInfo("ja-JP"))|"-0016"|
+
|(-16).ToString("D4", CultureInfo.GetCultureInfo("en-US"))|"-0016"|
+
|(-16).ToString("D4", CultureInfo.GetCultureInfo("fr-FR"))|"-0016"|
+
|(-16).ToString("D4", CultureInfo.GetCultureInfo("es-ES"))|"-0016"|
+
|(-16).ToString("D4", CultureInfo.InvariantCulture)|"-0016"|
 
:X, x (hexadecimal/16進数)|数値を16進形式で表した文字列でフォーマットする。
:X, x (hexadecimal/16進数)|数値を16進形式で表した文字列でフォーマットする。
 
桁数が指定されている場合は、指定された桁数で0埋めされる。
桁数が指定されている場合は、指定された桁数で0埋めされる。
 
|*書式指定子"X"のフォーマット例
|*書式指定子"X"のフォーマット例
399,34 204,11
 
非数と無限大の場合はそれぞれ次のようになる。
非数と無限大の場合はそれぞれ次のようになる。
 
|*書式指定子"F"と非数・無限大のフォーマット例
|*書式指定子"F"と非数・無限大のフォーマット例
 
|~値と書式指定子|~結果|h
|~値と書式指定子|~結果|h
~
|Double.NaN.ToString("F"))|"NaN (非数値)"|
|Double.NaN.ToString("F"))|"NaN"|
~
|Double.PositiveInfinity.ToString("F")|"+∞"|
|Double.PositiveInfinity.ToString("F")|"Infinity"|
~
|Double.NegativeInfinity.ToString("F")|"-∞"|
|Double.NegativeInfinity.ToString("F")|"-Infinity"|
~
|Double.NaN.ToString("F4")|"NaN (非数値)"|
|Double.NaN.ToString("F4")|"NaN"|
~
|Double.PositiveInfinity.ToString("F4")|"+∞"|
|Double.PositiveInfinity.ToString("F4")|"Infinity"|
+
また、小数点のピリオド、無限大記号、NaNの表記などはローカライズされた形式でフォーマットされる。
+
|*書式指定子"F", "f"とローカライズの例
+
|~値と書式指定子|~結果|h
+
|(-3.1416).ToString("F", CultureInfo.GetCultureInfo("ja-JP"))|"-3.14"|
+
|(-3.1416).ToString("F", CultureInfo.GetCultureInfo("en-US"))|"-3.14"|
+
|(-3.1416).ToString("F", CultureInfo.GetCultureInfo("fr-FR"))|"-3,14"|
+
|(-3.1416).ToString("F", CultureInfo.GetCultureInfo("es-ES"))|"-3,14"|
+
|(-3.1416).ToString("F", CultureInfo.InvariantCulture)|"-3.14"|
+
|Double.NaN.ToString("F", CultureInfo.GetCultureInfo("ja-JP"))|"NaN (非数値)"|
+
|Double.NaN.ToString("F", CultureInfo.GetCultureInfo("en-US"))|"NaN"|
+
|Double.NaN.ToString("F", CultureInfo.GetCultureInfo("fr-FR"))|"Non Numerique"|
+
|Double.NaN.ToString("F", CultureInfo.GetCultureInfo("es-ES"))|"NeuN"|
+
|Double.NaN.ToString("F", CultureInfo.InvariantCulture)|"NaN"|
+
|Double.PositiveInfinity.ToString("F", CultureInfo.GetCultureInfo("ja-JP"))|"+∞"|
+
|Double.PositiveInfinity.ToString("F", CultureInfo.GetCultureInfo("en-US"))|"Infinity"|
+
|Double.PositiveInfinity.ToString("F", CultureInfo.GetCultureInfo("fr-FR"))|"+Infini"|
+
|Double.PositiveInfinity.ToString("F", CultureInfo.GetCultureInfo("es-ES"))|"Infinito"|
+
|Double.PositiveInfinity.ToString("F", CultureInfo.InvariantCulture)|"Infinity"|
+
|Double.NegativeInfinity.ToString("F", CultureInfo.GetCultureInfo("ja-JP"))|"-∞"|
+
|Double.NegativeInfinity.ToString("F", CultureInfo.GetCultureInfo("en-US"))|"-Infinity"|
+
|Double.NegativeInfinity.ToString("F", CultureInfo.GetCultureInfo("fr-FR"))|"-Infini"|
+
|Double.NegativeInfinity.ToString("F", CultureInfo.GetCultureInfo("es-ES"))|"-Infinito"|
+
|Double.NegativeInfinity.ToString("F", CultureInfo.InvariantCulture)|"-Infinity"|
 
:E, e (exponential/指数)|数値を10進数の指数形式で表した文字列でフォーマットする。
:E, e (exponential/指数)|数値を10進数の指数形式で表した文字列でフォーマットする。
 
桁数が指定されている場合は、小数部が指定された桁数で0埋めしてフォーマットされる。 桁数が指定されていない場合は、小数部がデフォルトの桁数でフォーマットされる。
桁数が指定されている場合は、小数部が指定された桁数で0埋めしてフォーマットされる。 桁数が指定されていない場合は、小数部がデフォルトの桁数でフォーマットされる。
 
小数部をフォーマットする際に、省略される部分は四捨五入してフォーマットされる。
小数部をフォーマットする際に、省略される部分は四捨五入してフォーマットされる。
446,34 228,11
 
非数と無限大の場合はそれぞれ次のようになる。
非数と無限大の場合はそれぞれ次のようになる。
 
|~値と書式指定子|~結果|h
|~値と書式指定子|~結果|h
 
|*書式指定子"E"と非数・無限大のフォーマット例
|*書式指定子"E"と非数・無限大のフォーマット例
~
|Double.NaN.ToString("E"))|"NaN (非数値)"|
|Double.NaN.ToString("E"))|"NaN"|
~
|Double.PositiveInfinity.ToString("E")|"+∞"|
|Double.PositiveInfinity.ToString("E")|"Infinity"|
~
|Double.NegativeInfinity.ToString("E")|"-∞"|
|Double.NegativeInfinity.ToString("E")|"-Infinity"|
~
|Double.NaN.ToString("E4")|"NaN (非数値)"|
|Double.NaN.ToString("E4")|"NaN"|
~
|Double.PositiveInfinity.ToString("E4")|"+∞"|
|Double.PositiveInfinity.ToString("E4")|"Infinity"|
+
また、小数点のピリオド、無限大記号、NaNの表記などはローカライズされた形式でフォーマットされる。
+
|*書式指定子"E", "e"とローカライズの例
+
|~値と書式指定子|~結果|h
+
|(-3.1416).ToString("E", CultureInfo.GetCultureInfo("ja-JP"))|"-3.141600E+000"|
+
|(-3.1416).ToString("E", CultureInfo.GetCultureInfo("en-US"))|"-3.141600E+000"|
+
|(-3.1416).ToString("E", CultureInfo.GetCultureInfo("fr-FR"))|"-3,141600E+000"|
+
|(-3.1416).ToString("E", CultureInfo.GetCultureInfo("es-ES"))|"-3,141600E+000"|
+
|(-3.1416).ToString("E", CultureInfo.InvariantCulture)|"-3.141600E+000"|
+
|Double.NaN.ToString("E", CultureInfo.GetCultureInfo("ja-JP"))|"NaN (非数値)"|
+
|Double.NaN.ToString("E", CultureInfo.GetCultureInfo("en-US"))|"NaN"|
+
|Double.NaN.ToString("E", CultureInfo.GetCultureInfo("fr-FR"))|"Non Numerique"|
+
|Double.NaN.ToString("E", CultureInfo.GetCultureInfo("es-ES"))|"NeuN"|
+
|Double.NaN.ToString("E", CultureInfo.InvariantCulture)|"NaN"|
+
|Double.PositiveInfinity.ToString("E", CultureInfo.GetCultureInfo("ja-JP"))|"+∞"|
+
|Double.PositiveInfinity.ToString("E", CultureInfo.GetCultureInfo("en-US"))|"Infinity"|
+
|Double.PositiveInfinity.ToString("E", CultureInfo.GetCultureInfo("fr-FR"))|"+Infini"|
+
|Double.PositiveInfinity.ToString("E", CultureInfo.GetCultureInfo("es-ES"))|"Infinito"|
+
|Double.PositiveInfinity.ToString("E", CultureInfo.InvariantCulture)|"Infinity"|
+
|Double.NegativeInfinity.ToString("E", CultureInfo.GetCultureInfo("ja-JP"))|"-∞"|
+
|Double.NegativeInfinity.ToString("E", CultureInfo.GetCultureInfo("en-US"))|"-Infinity"|
+
|Double.NegativeInfinity.ToString("E", CultureInfo.GetCultureInfo("fr-FR"))|"-Infini"|
+
|Double.NegativeInfinity.ToString("E", CultureInfo.GetCultureInfo("es-ES"))|"-Infinito"|
+
|Double.NegativeInfinity.ToString("E", CultureInfo.InvariantCulture)|"-Infinity"|
 
:P, p (percent/パーセント)|数値をパーセント形式で表した文字列でフォーマットする。
:P, p (percent/パーセント)|数値をパーセント形式で表した文字列でフォーマットする。
 
数値に100を乗じた値でフォーマットされ(1.0で100%となり)、位取りのカンマが挿入される。 数値が整数型の場合でも同様。
数値に100を乗じた値でフォーマットされ(1.0で100%となり)、位取りのカンマが挿入される。 数値が整数型の場合でも同様。
 
桁数が指定されている場合は、小数部が指定された桁数で0埋めしてフォーマットされる。 桁数が指定されていない場合は、小数部がデフォルトの桁数でフォーマットされる。
桁数が指定されている場合は、小数部が指定された桁数で0埋めしてフォーマットされる。 桁数が指定されていない場合は、小数部がデフォルトの桁数でフォーマットされる。
486,14 245,13
 
|(-0.5).ToString("P4")|"-50.0000%"|
|(-0.5).ToString("P4")|"-50.0000%"|
 
|(72).ToString("P")|"7,200.00%"|
|(72).ToString("P")|"7,200.00%"|
 
|(0.0625).ToString("P1")|"6.3%"|
|(0.0625).ToString("P1")|"6.3%"|
~
また、位取りのカンマ、小数点のピリオド、パーセント記号と挿入される空白などはローカライズされた形式でフォーマットされる。
また、位取りのカンマ、小数点のピリオド、パーセント記号などはローカライズされた形式でフォーマットされる。
 
|*書式指定子"P", "p"とローカライズの例
|*書式指定子"P", "p"とローカライズの例
 
|~値と書式指定子|~結果|h
|~値と書式指定子|~結果|h
 
|(-1.0).ToString("P", CultureInfo.GetCultureInfo("ja-JP"))|"-100.00%"|
|(-1.0).ToString("P", CultureInfo.GetCultureInfo("ja-JP"))|"-100.00%"|
 
|(-1.0).ToString("P", CultureInfo.GetCultureInfo("en-US"))|"-100.00 %"|
|(-1.0).ToString("P", CultureInfo.GetCultureInfo("en-US"))|"-100.00 %"|
 
|(-1.0).ToString("P", CultureInfo.GetCultureInfo("fr-FR"))|"-100,00 %"|
|(-1.0).ToString("P", CultureInfo.GetCultureInfo("fr-FR"))|"-100,00 %"|
 
|(-1.0).ToString("P", CultureInfo.GetCultureInfo("es-ES"))|"-100,00%"|
|(-1.0).ToString("P", CultureInfo.GetCultureInfo("es-ES"))|"-100,00%"|
+
|(-1.0).ToString("P", CultureInfo.InvariantCulture)|"-100.00 %"|
 
パーミル形式で表した文字列でフォーマットしたい場合は、[[カスタム数値書式指定子>#customformat_numeric_percent]]を使用する。
パーミル形式で表した文字列でフォーマットしたい場合は、[[カスタム数値書式指定子>#customformat_numeric_percent]]を使用する。
 
:N, n (number/数値)|数値を10進数の固定小数点形式で表した文字列でフォーマットする。
:N, n (number/数値)|数値を10進数の固定小数点形式で表した文字列でフォーマットする。
 
基本的には"F", "f"と同様だが、位取りのカンマが挿入される。
基本的には"F", "f"と同様だが、位取りのカンマが挿入される。
508,7 266,6
 
|(-1234567.89).ToString("N", CultureInfo.GetCultureInfo("en-US"))|"-1,234,567.89"|
|(-1234567.89).ToString("N", CultureInfo.GetCultureInfo("en-US"))|"-1,234,567.89"|
 
|(-1234567.89).ToString("N", CultureInfo.GetCultureInfo("fr-FR"))|"-1 234 567,89"|
|(-1234567.89).ToString("N", CultureInfo.GetCultureInfo("fr-FR"))|"-1 234 567,89"|
 
|(-1234567.89).ToString("N", CultureInfo.GetCultureInfo("es-ES"))|"-1.234.567,89"|
|(-1234567.89).ToString("N", CultureInfo.GetCultureInfo("es-ES"))|"-1.234.567,89"|
+
|(-1234567.89).ToString("N", CultureInfo.InvariantCulture)|"-1,234,567.89"|
 
:G, g (general/一般)|(未整理) 数値を10進数で表した文字列でフォーマットする。 指数形式もしくは固定小数点形式のうち、より簡潔な形式でフォーマットされる。
:G, g (general/一般)|(未整理) 数値を10進数で表した文字列でフォーマットする。 指数形式もしくは固定小数点形式のうち、より簡潔な形式でフォーマットされる。
 
桁数を指定しない場合、数値の型によって適切な桁数が設定される(?)
桁数を指定しない場合、数値の型によって適切な桁数が設定される(?)
 
小文字の"g"を指定した場合は、指数部の前の'E'の代わりに小文字の'e'を使ってフォーマットされる。
小文字の"g"を指定した場合は、指数部の前の'E'の代わりに小文字の'e'を使ってフォーマットされる。
533,7 290,7
 
|(-16).ToString("C2")|"-¥16.00"|
|(-16).ToString("C2")|"-¥16.00"|
 
|(3.1416).ToString("C")|"¥3"|
|(3.1416).ToString("C")|"¥3"|
 
|(3.1416).ToString("C3")|"¥3.142"|
|(3.1416).ToString("C3")|"¥3.142"|
~
また、位取りのカンマ、小数点のピリオド、通貨単位記号と挿入される空白などはローカライズされた形式でフォーマットされる。
また、位取りのカンマ、小数点のピリオド、通貨単位記号などはローカライズされた形式でフォーマットされる。
 
|*書式指定子"C", "c"とローカライズの例
|*書式指定子"C", "c"とローカライズの例
 
|~値と書式指定子|~結果|h
|~値と書式指定子|~結果|h
 
|(-12345.67).ToString("C", CultureInfo.GetCultureInfo("ja-JP"))|"-¥12,346"|
|(-12345.67).ToString("C", CultureInfo.GetCultureInfo("ja-JP"))|"-¥12,346"|
541,7 298,6
 
|(-12345.67).ToString("C", CultureInfo.GetCultureInfo("en-GB"))|"-£12,345.67"|
|(-12345.67).ToString("C", CultureInfo.GetCultureInfo("en-GB"))|"-£12,345.67"|
 
|(-12345.67).ToString("C", CultureInfo.GetCultureInfo("fr-FR"))|"-12 345,67 €"|
|(-12345.67).ToString("C", CultureInfo.GetCultureInfo("fr-FR"))|"-12 345,67 €"|
 
|(-12345.67).ToString("C", CultureInfo.GetCultureInfo("es-ES"))|"-12.345,67 €"|
|(-12345.67).ToString("C", CultureInfo.GetCultureInfo("es-ES"))|"-12.345,67 €"|
+
|(-12345.67).ToString("C", CultureInfo.InvariantCulture)|"(¤12,345.67)"|
 

                

                
 
***SingleおよびDoubleのみに指定できる書式指定子
***SingleおよびDoubleのみに指定できる書式指定子
 
以下の書式指定子はfloat(Single), doubleの浮動小数点型(.NET Framework 4以降では&msdn(netfx,type,System.Numerics.BigInteger){BigInteger};も含む)の値に対してのみ指定できます。
以下の書式指定子はfloat(Single), doubleの浮動小数点型(.NET Framework 4以降では&msdn(netfx,type,System.Numerics.BigInteger){BigInteger};も含む)の値に対してのみ指定できます。
555,19 311,6
 
|~値と書式指定子|~結果|h
|~値と書式指定子|~結果|h
 
|(2.0/3.0).ToString("R4")|"0.66666666666666663"|
|(2.0/3.0).ToString("R4")|"0.66666666666666663"|
 
|(1.0f/3.0f).ToString("R4")|"0.333333343"|
|(1.0f/3.0f).ToString("R4")|"0.333333343"|
+
なお、小数点のピリオドなどはローカライズされた形式でフォーマットされる点には注意が必要。
+
|*書式指定子"R", "r"とローカライズの例
+
|~値と書式指定子|~結果|h
+
|(2.0/3.0).ToString("R", CultureInfo.GetCultureInfo("ja-JP"))|"0.66666666666666663"|
+
|(2.0/3.0).ToString("R", CultureInfo.GetCultureInfo("en-US"))|"0.66666666666666663"|
+
|(2.0/3.0).ToString("R", CultureInfo.GetCultureInfo("fr-FR"))|"0,66666666666666663"|
+
|(2.0/3.0).ToString("R", CultureInfo.GetCultureInfo("es-ES"))|"0,66666666666666663"|
+
|(2.0/3.0).ToString("R", CultureInfo.InvariantCulture)|"0.66666666666666663"|
+
|(2.0f/3.0f).ToString("R", CultureInfo.GetCultureInfo("ja-JP"))|"0.6666667"|
+
|(2.0f/3.0f).ToString("R", CultureInfo.GetCultureInfo("en-US"))|"0.6666667"|
+
|(2.0f/3.0f).ToString("R", CultureInfo.GetCultureInfo("fr-FR"))|"0,6666667"|
+
|(2.0f/3.0f).ToString("R", CultureInfo.GetCultureInfo("es-ES"))|"0,6666667"|
+
|(2.0f/3.0f).ToString("R", CultureInfo.InvariantCulture)|"0.6666667"|
 

                

                
 
**日付と時刻の書式指定子
**日付と時刻の書式指定子
 
以下の書式指定子はDateTimeまたはDateTimeOffsetの日付型の値に対して指定できます。 (MSDN: &msdn(netfx,id,az4se3k1){標準の日付と時刻の書式指定文字列};)
以下の書式指定子はDateTimeまたはDateTimeOffsetの日付型の値に対して指定できます。 (MSDN: &msdn(netfx,id,az4se3k1){標準の日付と時刻の書式指定文字列};)
576,14 319,14
 
以下の書式指定子はローカライズされていない(カルチャに依存しない)形式でフォーマットされます。
以下の書式指定子はローカライズされていない(カルチャに依存しない)形式でフォーマットされます。
 

                

                
 
:R, r (RFC1123)|HTTPなどで用いられるRFC1123形式でフォーマットする。
:R, r (RFC1123)|HTTPなどで用いられるRFC1123形式でフォーマットする。
~
UTCとしてフォーマットされるが、DateTime型の場合はフォーマットの際にUTCへの変換は行われないので、ToUniversalTimeメソッドを使ってUTCに変換しておく必要がある。
UTCとしてフォーマットされるが、DateTime型の場合はフォーマットの際にUTCへの変換は行われないので、ToUniversalTime()メソッドを使ってUTCに変換しておく必要がある。
 
:O, o (round-trip date/time)|XMLなどで用いられるW3C-DTF(W3C Date and Time Formats, ISO8601)形式でフォーマットする。
:O, o (round-trip date/time)|XMLなどで用いられるW3C-DTF(W3C Date and Time Formats, ISO8601)形式でフォーマットする。
 
秒の端数はTicks(100ナノ秒)の精度でフォーマットされる。
秒の端数はTicks(100ナノ秒)の精度でフォーマットされる。
 
:s (sortable date/time)|ソートに適した形式でフォーマットする。
:s (sortable date/time)|ソートに適した形式でフォーマットする。
 
W3C-DTF形式に似ているが、秒の端数はフォーマットされない。 また、タイムゾーンのオフセット値もフォーマットされない。
W3C-DTF形式に似ているが、秒の端数はフォーマットされない。 また、タイムゾーンのオフセット値もフォーマットされない。
 
:u (universal sortable date/time)|"s"と同様、ソートに適した形式でフォーマットする。
:u (universal sortable date/time)|"s"と同様、ソートに適した形式でフォーマットする。
 
"s"とは異なり、UTCとしてフォーマットされ(最後に'Z'が付く)、日付と時刻の間は'T'ではなく空白になる。
"s"とは異なり、UTCとしてフォーマットされ(最後に'Z'が付く)、日付と時刻の間は'T'ではなく空白になる。
~
UTCとしてフォーマットされるが、DateTime型の場合はフォーマットの際にUTCへの変換は行われないので、ToUniversalTimeメソッドを使ってUTCに変換しておく必要がある。
UTCとしてフォーマットされるが、DateTime型の場合はフォーマットの際にUTCへの変換は行われないので、ToUniversalTime()メソッドを使ってUTCに変換しておく必要がある。
 

                

                
 
|*書式指定子"r", "o", "s", "u"とDateTime型のフォーマット例
|*書式指定子"r", "o", "s", "u"とDateTime型のフォーマット例
 
|~値と書式指定子|~結果|h
|~値と書式指定子|~結果|h
614,11 357,9
 
|DateTime.Now.ToString("D", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月14日"|
|DateTime.Now.ToString("D", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月14日"|
 
|DateTime.Now.ToString("D", CultureInfo.GetCultureInfo("en-US"))|"Tuesday, September 14, 2010"|
|DateTime.Now.ToString("D", CultureInfo.GetCultureInfo("en-US"))|"Tuesday, September 14, 2010"|
 
|DateTime.Now.ToString("D", CultureInfo.GetCultureInfo("es-ES"))|"martes, 14 de septiembre de 2010"|
|DateTime.Now.ToString("D", CultureInfo.GetCultureInfo("es-ES"))|"martes, 14 de septiembre de 2010"|
+
|DateTime.Now.ToString("D", CultureInfo.InvariantCulture)|"Tuesday, 14 September 2010"|
 
|DateTime.Now.ToString("d", CultureInfo.GetCultureInfo("ja-JP"))|"2010/09/14"|
|DateTime.Now.ToString("d", CultureInfo.GetCultureInfo("ja-JP"))|"2010/09/14"|
 
|DateTime.Now.ToString("d", CultureInfo.GetCultureInfo("en-US"))|"9/14/2010"|
|DateTime.Now.ToString("d", CultureInfo.GetCultureInfo("en-US"))|"9/14/2010"|
 
|DateTime.Now.ToString("d", CultureInfo.GetCultureInfo("es-ES"))|"14/09/2010"|
|DateTime.Now.ToString("d", CultureInfo.GetCultureInfo("es-ES"))|"14/09/2010"|
+
|DateTime.Now.ToString("d", CultureInfo.InvariantCulture)|"09/14/2010"|
 
:T, t (time)|時刻のみ(時分秒)の形式でフォーマットする。
:T, t (time)|時刻のみ(時分秒)の形式でフォーマットする。
 
"T"の場合は長い形式、"t"の場合は短い形式でフォーマットされる。
"T"の場合は長い形式、"t"の場合は短い形式でフォーマットされる。
 
ToLongTimeString(), ToShortTimeString()でも同じ結果が得られる。
ToLongTimeString(), ToShortTimeString()でも同じ結果が得られる。
629,11 370,9
 
|DateTime.Now.ToString("T", CultureInfo.GetCultureInfo("ja-JP"))|"1:02:03"|
|DateTime.Now.ToString("T", CultureInfo.GetCultureInfo("ja-JP"))|"1:02:03"|
 
|DateTime.Now.ToString("T", CultureInfo.GetCultureInfo("en-US"))|"1:02:03 AM"|
|DateTime.Now.ToString("T", CultureInfo.GetCultureInfo("en-US"))|"1:02:03 AM"|
 
|DateTime.Now.ToString("T", CultureInfo.GetCultureInfo("es-ES"))|"1:02:03"|
|DateTime.Now.ToString("T", CultureInfo.GetCultureInfo("es-ES"))|"1:02:03"|
+
|DateTime.Now.ToString("T", CultureInfo.InvariantCulture)|"01:02:03"|
 
|DateTime.Now.ToString("t", CultureInfo.GetCultureInfo("ja-JP"))|"1:02"|
|DateTime.Now.ToString("t", CultureInfo.GetCultureInfo("ja-JP"))|"1:02"|
 
|DateTime.Now.ToString("t", CultureInfo.GetCultureInfo("en-US"))|"1:02 AM"|
|DateTime.Now.ToString("t", CultureInfo.GetCultureInfo("en-US"))|"1:02 AM"|
 
|DateTime.Now.ToString("t", CultureInfo.GetCultureInfo("es-ES"))|"1:02"|
|DateTime.Now.ToString("t", CultureInfo.GetCultureInfo("es-ES"))|"1:02"|
+
|DateTime.Now.ToString("t", CultureInfo.InvariantCulture)|"01:02"|
 
:Y, y (year/month)|年月のみの形式でフォーマットする。
:Y, y (year/month)|年月のみの形式でフォーマットする。
 
|*書式指定子"Y", "y"のフォーマット例
|*書式指定子"Y", "y"のフォーマット例
 
|~値と書式指定子|~結果|h
|~値と書式指定子|~結果|h
642,7 381,6
 
|DateTime.Now.ToString("Y", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月"|
|DateTime.Now.ToString("Y", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月"|
 
|DateTime.Now.ToString("Y", CultureInfo.GetCultureInfo("en-US"))|"September, 2010"|
|DateTime.Now.ToString("Y", CultureInfo.GetCultureInfo("en-US"))|"September, 2010"|
 
|DateTime.Now.ToString("Y", CultureInfo.GetCultureInfo("es-ES"))|"septiembre de 2010"|
|DateTime.Now.ToString("Y", CultureInfo.GetCultureInfo("es-ES"))|"septiembre de 2010"|
+
|DateTime.Now.ToString("Y", CultureInfo.InvariantCulture)|"2010 September"|
 
:M, m (month/day)|月日のみの形式でフォーマットする。
:M, m (month/day)|月日のみの形式でフォーマットする。
 
|*書式指定子"M", "m"のフォーマット例
|*書式指定子"M", "m"のフォーマット例
 
|~値と書式指定子|~結果|h
|~値と書式指定子|~結果|h
651,7 389,6
 
|DateTime.Now.ToString("M", CultureInfo.GetCultureInfo("ja-JP"))|"9月14日"|
|DateTime.Now.ToString("M", CultureInfo.GetCultureInfo("ja-JP"))|"9月14日"|
 
|DateTime.Now.ToString("M", CultureInfo.GetCultureInfo("en-US"))|"September 14"|
|DateTime.Now.ToString("M", CultureInfo.GetCultureInfo("en-US"))|"September 14"|
 
|DateTime.Now.ToString("M", CultureInfo.GetCultureInfo("es-ES"))|"14 septiembre"|
|DateTime.Now.ToString("M", CultureInfo.GetCultureInfo("es-ES"))|"14 septiembre"|
+
|DateTime.Now.ToString("M", CultureInfo.InvariantCulture)|"September 14"|
 
:F, f (full date/time)|完全な日付と時刻の形式でフォーマットする。
:F, f (full date/time)|完全な日付と時刻の形式でフォーマットする。
 
"F"の場合は長い形式、"f"の場合は短い形式でフォーマットされる。 "f"は"D"(長い形式の日付)と"t"(短い形式の時刻)を繋げた形式となる。
"F"の場合は長い形式、"f"の場合は短い形式でフォーマットされる。 "f"は"D"(長い形式の日付)と"t"(短い形式の時刻)を繋げた形式となる。
 
|*書式指定子"F", "f"のフォーマット例
|*書式指定子"F", "f"のフォーマット例
661,11 398,9
 
|DateTime.Now.ToString("F", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月14日 1:02:03"|
|DateTime.Now.ToString("F", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月14日 1:02:03"|
 
|DateTime.Now.ToString("F", CultureInfo.GetCultureInfo("en-US"))|"Tuesday, September 14, 2010 1:02:03 AM"|
|DateTime.Now.ToString("F", CultureInfo.GetCultureInfo("en-US"))|"Tuesday, September 14, 2010 1:02:03 AM"|
 
|DateTime.Now.ToString("F", CultureInfo.GetCultureInfo("es-ES"))|"martes, 14 de septiembre de 2010 1:02:03"|
|DateTime.Now.ToString("F", CultureInfo.GetCultureInfo("es-ES"))|"martes, 14 de septiembre de 2010 1:02:03"|
+
|DateTime.Now.ToString("F", CultureInfo.InvariantCulture)|"Tuesday, 14 September 2010 01:02:03"|
 
|DateTime.Now.ToString("f", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月14日 1:02:03"|
|DateTime.Now.ToString("f", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月14日 1:02:03"|
 
|DateTime.Now.ToString("f", CultureInfo.GetCultureInfo("en-US"))|"Tuesday, September 14, 2010 1:02 AM"|
|DateTime.Now.ToString("f", CultureInfo.GetCultureInfo("en-US"))|"Tuesday, September 14, 2010 1:02 AM"|
 
|DateTime.Now.ToString("f", CultureInfo.GetCultureInfo("es-ES"))|"martes, 14 de septiembre de 2010 1:02"|
|DateTime.Now.ToString("f", CultureInfo.GetCultureInfo("es-ES"))|"martes, 14 de septiembre de 2010 1:02"|
+
|DateTime.Now.ToString("f", CultureInfo.InvariantCulture)|"Tuesday, 14 September 2010 01:02"|
 
:G, g (general date/time)|一般的な日付と時刻の形式でフォーマットする。
:G, g (general date/time)|一般的な日付と時刻の形式でフォーマットする。
 
"G"の場合は長い形式、"g"の場合は短い形式でフォーマットされる。 "g"は"d"(短い形式の日付)と"t"(短い形式の時刻)を繋げた形式となる。
"G"の場合は長い形式、"g"の場合は短い形式でフォーマットされる。 "g"は"d"(短い形式の日付)と"t"(短い形式の時刻)を繋げた形式となる。
 
|*書式指定子"G", "g"のフォーマット例
|*書式指定子"G", "g"のフォーマット例
675,11 410,9
 
|DateTime.Now.ToString("G", CultureInfo.GetCultureInfo("ja-JP"))|"2010/09/14 1:02:03"|
|DateTime.Now.ToString("G", CultureInfo.GetCultureInfo("ja-JP"))|"2010/09/14 1:02:03"|
 
|DateTime.Now.ToString("G", CultureInfo.GetCultureInfo("en-US"))|"9/14/2010 1:02:03 AM"|
|DateTime.Now.ToString("G", CultureInfo.GetCultureInfo("en-US"))|"9/14/2010 1:02:03 AM"|
 
|DateTime.Now.ToString("G", CultureInfo.GetCultureInfo("es-ES"))|"14/09/2010 1:02:03"|
|DateTime.Now.ToString("G", CultureInfo.GetCultureInfo("es-ES"))|"14/09/2010 1:02:03"|
+
|DateTime.Now.ToString("G", CultureInfo.InvariantCulture)|"09/14/2010 01:02:03"|
 
|DateTime.Now.ToString("g", CultureInfo.GetCultureInfo("ja-JP"))|"2010/09/14 1:02"|
|DateTime.Now.ToString("g", CultureInfo.GetCultureInfo("ja-JP"))|"2010/09/14 1:02"|
 
|DateTime.Now.ToString("g", CultureInfo.GetCultureInfo("en-US"))|"9/14/2010 1:02 AM"|
|DateTime.Now.ToString("g", CultureInfo.GetCultureInfo("en-US"))|"9/14/2010 1:02 AM"|
 
|DateTime.Now.ToString("g", CultureInfo.GetCultureInfo("es-ES"))|"14/09/2010 1:02"|
|DateTime.Now.ToString("g", CultureInfo.GetCultureInfo("es-ES"))|"14/09/2010 1:02"|
+
|DateTime.Now.ToString("g", CultureInfo.InvariantCulture)|"09/14/2010 01:02"|
 
:U (universal full date/time)|UTCでの完全な日付と日時の形式でフォーマットする。
:U (universal full date/time)|UTCでの完全な日付と日時の形式でフォーマットする。
 
値がDateTime型の場合は自動的にUTCに変換され、"F"と同じ形式でフォーマットされる。
値がDateTime型の場合は自動的にUTCに変換され、"F"と同じ形式でフォーマットされる。
 
DateTimeOffset型の値ではサポートされない(FormatExceptionがスローされる)。
DateTimeOffset型の値ではサポートされない(FormatExceptionがスローされる)。
690,7 423,6
 
|DateTime.Now.ToString("U", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月13日 16:02:03"|
|DateTime.Now.ToString("U", CultureInfo.GetCultureInfo("ja-JP"))|"2010年9月13日 16:02:03"|
 
|DateTime.Now.ToString("U", CultureInfo.GetCultureInfo("en-US"))|"Monday, September 13, 2010 4:02:03 PM"|
|DateTime.Now.ToString("U", CultureInfo.GetCultureInfo("en-US"))|"Monday, September 13, 2010 4:02:03 PM"|
 
|DateTime.Now.ToString("U", CultureInfo.GetCultureInfo("es-ES"))|"lunes, 13 de septiembre de 2010 16:02:03"|
|DateTime.Now.ToString("U", CultureInfo.GetCultureInfo("es-ES"))|"lunes, 13 de septiembre de 2010 16:02:03"|
+
|DateTime.Now.ToString("U", CultureInfo.InvariantCulture)|"Monday, 13 September 2010 16:02:03"|
 

                

                
 
**列挙型の書式指定子
**列挙型の書式指定子
 
以下の書式指定子は列挙型の値に対して指定できます。 (MSDN: &msdn(netfx,id,c3s1ez6e){列挙型書式指定文字列};)
以下の書式指定子は列挙型の値に対して指定できます。 (MSDN: &msdn(netfx,id,c3s1ez6e){列挙型書式指定文字列};)
717,11 449,7
 
|(FileAttributes.Archive | FileAttributes.Normal).ToString("X")|"000000a0"|
|(FileAttributes.Archive | FileAttributes.Normal).ToString("X")|"000000a0"|
 
|(FileAttributes.Archive | FileAttributes.Normal).ToString("x")|"000000A0"|
|(FileAttributes.Archive | FileAttributes.Normal).ToString("x")|"000000A0"|
 
また、基になる型に応じて適切な桁数で0埋めされてフォーマットされる。
また、基になる型に応じて適切な桁数で0埋めされてフォーマットされる。
+

                  
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
+
using System;
+

                  
 
enum ByteEnum : byte {
enum ByteEnum : byte {
 
  E1 = 0x0f,
  E1 = 0x0f,
 
}
}
738,9 466,8
 
  E1 = 0x00000000ffffffff,
  E1 = 0x00000000ffffffff,
 
}
}
 

                

                
~
class Sample
class Sample {
~
{
  public static void Main()
+
  static void Main()
 
  {
  {
 
    Console.WriteLine(ByteEnum.E1.ToString("X"));   // 0F
    Console.WriteLine(ByteEnum.E1.ToString("X"));   // 0F
 
    Console.WriteLine(ShortEnum.E1.ToString("X"));  // 00FF
    Console.WriteLine(ShortEnum.E1.ToString("X"));  // 00FF
749,36 476,6
 
  }
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

                  
+
Enum ByteEnum As Byte
+
  E1 = &h0F
+
End Enum
+

                  
+
Enum ShortEnum As Short
+
  E1 = &h00FF
+
End Enum
+

                  
+
Enum IntEnum As Integer
+
  E1 = &h0000FFFF
+
End Enum
+

                  
+
Enum LongEnum As Long
+
  E1 = &h00000000FFFFFFFF
+
End Enum
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine(ByteEnum.E1.ToString("X"))    ' 0F
+
    Console.WriteLine(ShortEnum.E1.ToString("X"))   ' 00FF
+
    Console.WriteLine(IntEnum.E1.ToString("X"))     ' 0000FFFF
+
    Console.WriteLine(LongEnum.E1.ToString("X"))    ' 00000000FFFFFFFF
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 
:G, g (general)|列挙型の値を文字列(メンバ名)でフォーマットする。
:G, g (general)|列挙型の値を文字列(メンバ名)でフォーマットする。
 
FlagsAttributeが適用されている列挙型の場合、有効な値の組み合わせをカンマ区切りの文字列でフォーマットされる。
FlagsAttributeが適用されている列挙型の場合、有効な値の組み合わせをカンマ区切りの文字列でフォーマットされる。
 
FlagsAttributeが適用されていない列挙型の場合、文字列で表現できない場合は、数値(Dと同じ)でフォーマットされる。
FlagsAttributeが適用されていない列挙型の場合、文字列で表現できない場合は、数値(Dと同じ)でフォーマットされる。
798,7 495,7
 
|((FileAttributes)0x7fffffff).ToString("F")|"2147483647"|
|((FileAttributes)0x7fffffff).ToString("F")|"2147483647"|
 

                

                
 
**時間間隔の書式指定子
**時間間隔の書式指定子
~
.NET Framework 4以降では、TimeSpan型の値についても書式指定子を使ってフォーマットできるようになっています。 以下の書式指定子はTimeSpan型の値に対して指定できます。 (MSDN: &msdn(netfx,id,ee372286){標準の時間間隔書式指定文字列};)
.NET Framework 4以降では、TimeSpan型の値についても書式指定子を使ってフォーマットできるようになっています。 以下の書式指定子はTimeSpane型の値に対して指定できます。 (MSDN: &msdn(netfx,id,ee372286){標準の時間間隔書式指定文字列};)
 

                

                
 
:c (constant)|固定の形式でフォーマットする。
:c (constant)|固定の形式でフォーマットする。
 
時分秒は常にhh:mm:ssの形式で0埋めされてフォーマットされ、ミリ秒および日数は0でない場合にフォーマットされる。
時分秒は常にhh:mm:ssの形式で0埋めされてフォーマットされ、ミリ秒および日数は0でない場合にフォーマットされる。
817,16 514,14
 
|~値と書式指定子|~結果|h
|~値と書式指定子|~結果|h
 
|(new TimeSpan(1, 2, 3)).ToString("g")|"1:2:03"|
|(new TimeSpan(1, 2, 3)).ToString("g")|"1:2:03"|
 
|(new TimeSpan(1, 2, 3)).ToString("G")|"0:01:02:03.0000000"|
|(new TimeSpan(1, 2, 3)).ToString("G")|"0:01:02:03.0000000"|
~
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("g")|"-1:2:03:04.567"|
|(new TimeSpan(1, 2, 3, 4, 567)).ToString("g")|"1:2:03:04.567"|
~
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("G")|"-1:02:03:04.5670000"|
|(new TimeSpan(1, 2, 3, 4, 567)).ToString("G")|"1:02:03:04.5670000"|
~
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("g", CultureInfo.GetCultureInfo("ja-JP"))|"-1:2:03:04.567"|
|(new TimeSpan(1, 2, 3, 4, 567)).ToString("g", CultureInfo.GetCultureInfo("ja-JP"))|"1:2:03:04.567"|
~
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("g", CultureInfo.GetCultureInfo("en-US"))|"-1:2:03:04.567"|
|(new TimeSpan(1, 2, 3, 4, 567)).ToString("g", CultureInfo.GetCultureInfo("en-US"))|"1:2:03:04.567"|
~
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("g", CultureInfo.GetCultureInfo("fr-FR"))|"-1:2:03:04,567"|
|(new TimeSpan(1, 2, 3, 4, 567)).ToString("g", CultureInfo.GetCultureInfo("fr-FR"))|"1:2:03:04,567"|
~
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("g", CultureInfo.InvariantCulture)|"-1:2:03:04.567"|
|(new TimeSpan(1, 2, 3, 4, 567)).ToString("G", CultureInfo.GetCultureInfo("ja-JP"))|"1:02:03:04.5670000"|
~
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("G", CultureInfo.GetCultureInfo("ja-JP"))|"-1:02:03:04.5670000"|
|(new TimeSpan(1, 2, 3, 4, 567)).ToString("G", CultureInfo.GetCultureInfo("en-US"))|"1:02:03:04.5670000"|
~
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("G", CultureInfo.GetCultureInfo("en-US"))|"-1:02:03:04.5670000"|
|(new TimeSpan(1, 2, 3, 4, 567)).ToString("G", CultureInfo.GetCultureInfo("fr-FR"))|"1:02:03:04,5670000"|
+
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("G", CultureInfo.GetCultureInfo("fr-FR"))|"-1:02:03:04,5670000"|
+
|(new TimeSpan(-1, -2, -3, -4, -567)).ToString("G", CultureInfo.InvariantCulture)|"-1:02:03:04.5670000"|
 

                

                
 
*カスタム書式指定子
*カスタム書式指定子
 
このセクションは未整理です。
このセクションは未整理です。
840,10 535,8
 
|(72).ToString("0000.#")|"0072"|
|(72).ToString("0000.#")|"0072"|
 
|(3.1416).ToString("0000.0")|"0003.1"|
|(3.1416).ToString("0000.0")|"0003.1"|
 
|(3.1416).ToString("0000.0", CultureInfo.GetCultureInfo("fr-FR"))|"0003,1"|
|(3.1416).ToString("0000.0", CultureInfo.GetCultureInfo("fr-FR"))|"0003,1"|
+
|(3.1416).ToString("0000.0", CultureInfo.InvariantCulture)|"0003.1"|
 
|(123456789).ToString("#,###")|"123,456,789"|
|(123456789).ToString("#,###")|"123,456,789"|
 
|(123456789).ToString("#,###", CultureInfo.GetCultureInfo("fr-FR"))|"123 456 789"|
|(123456789).ToString("#,###", CultureInfo.GetCultureInfo("fr-FR"))|"123 456 789"|
+
|(123456789).ToString("#,###", CultureInfo.InvariantCulture)|"123,456,789"|
 
|(1234567).ToString("##.#e+0")|"12.3e+5"|
|(1234567).ToString("##.#e+0")|"12.3e+5"|
 

                

                
 
***&aname(customformat_numeric_percent){パーセント・パーミル};
***&aname(customformat_numeric_percent){パーセント・パーミル};
863,13 556,9
 
|DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFzzz")|"2010-09-14T01:02:03.456789+09:00"|
|DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.FFFFFFFzzz")|"2010-09-14T01:02:03.456789+09:00"|
 
|DateTime.Now.ToString("yyyy/MM/dd (dddd) hh:mm:ss")|"2010/09/14 (火曜日) 01:02:03"|
|DateTime.Now.ToString("yyyy/MM/dd (dddd) hh:mm:ss")|"2010/09/14 (火曜日) 01:02:03"|
 
|DateTime.Now.ToString("yyyy/MM/dd (dddd) hh:mm:ss", CultureInfo.GetCultureInfo("en-US"))|"2010/09/14 (Tuesday) 01:02:03"|
|DateTime.Now.ToString("yyyy/MM/dd (dddd) hh:mm:ss", CultureInfo.GetCultureInfo("en-US"))|"2010/09/14 (Tuesday) 01:02:03"|
+
|DateTime.Now.ToString("yyyy/MM/dd (dddd) hh:mm:ss", CultureInfo.InvariantCulture)|"2010/09/14 (Tuesday) 01:02:03"|
 
|DateTime.Now.ToString("ddd, d MMM yyyy HH:mm:ss K")|"火, 14 9 2010 01:02:03 +09:00"|
|DateTime.Now.ToString("ddd, d MMM yyyy HH:mm:ss K")|"火, 14 9 2010 01:02:03 +09:00"|
 
|DateTime.Now.ToString("ddd, d MMM yyyy HH:mm:ss K", CultureInfo.GetCultureInfo("en-US"))|"Tue, 14 Sep 2010 01:02:03 +09:00"|
|DateTime.Now.ToString("ddd, d MMM yyyy HH:mm:ss K", CultureInfo.GetCultureInfo("en-US"))|"Tue, 14 Sep 2010 01:02:03 +09:00"|
+
|DateTime.Now.ToString("ddd, d MMM yyyy HH:mm:ss K", CultureInfo.InvariantCulture)|"Tue, 14 Sep 2010 01:02:03 +09:00"|
 
|DateTime.UtcNow.ToString("ddd, d MMM yyyy HH:mm:ss K")|"月, 13 9 2010 16:02:03 Z"|
|DateTime.UtcNow.ToString("ddd, d MMM yyyy HH:mm:ss K")|"月, 13 9 2010 16:02:03 Z"|
+
|DateTime.UtcNow.ToString("ddd, d MMM yyyy HH:mm:ss K", CultureInfo.GetCultureInfo("en-US"))|"Mon, 13 Sep 2010 16:02:03 Z"|
+
|DateTime.UtcNow.ToString("ddd, d MMM yyyy HH:mm:ss K", CultureInfo.InvariantCulture)|"Mon, 13 Sep 2010 16:02:03 Z"|
 

                

                
 
**時間間隔のカスタム書式指定子
**時間間隔のカスタム書式指定子
 
(MSDN: &msdn(netfx,id,ee372287){カスタム時間間隔書式指定文字列};)
(MSDN: &msdn(netfx,id,ee372287){カスタム時間間隔書式指定文字列};)
883,89 572,39
 

                

                
 
----
----
 

                

                
~
*書式プロバイダ (IFormatProvider)
*書式プロバイダ(IFormatProvider)
~
書式プロバイダ(&msdn(netfx,type,System.IFormatProvider){IFormatProvider};)は、 ''D'', ''G'' などの書式指定子で指定される書式から適切な形式の文字列にするためのメソッドを提供するインターフェイスで、ToString等のメソッドから参照されます。
書式プロバイダ(&msdn(netfx,type,System.IFormatProvider){IFormatProvider};)は、"D", "G"などの書式指定子を適切な形式の文字列にするためのメソッドを提供するインターフェイスで、ToString()等のメソッドから参照されます。
 

                

                
~
**書式プロバイダとスレッドのカルチャ
**スレッドのカルチャと書式プロバイダ
~
ToString等のメソッドでは、引数にIFormatProviderをとるオーバーロードが用意されています。 これらのメソッドでIFormatProviderを指定した場合はそれが書式プロバイダとして機能し、書式化の際に使用されます。 書式プロバイダを指定しなかった場合は、現在のスレッドのカルチャ(Thread.CurrentThread.CurrentCulture)が提供する書式を使ってフォーマットされます。
ToString()等のメソッドで書式プロバイダを指定しなかった場合は、現在のスレッドのカルチャ(Thread.CurrentThread.CurrentCulture)が提供する書式を使ってフォーマットされます。 Thread.CurrentThread.CurrentCultureにCultureInfoクラスのインスタンスを設定するか、IFormatProviderを指定してToString()等を呼び出すことで、フォーマットの際の書式を指定できます。
 

                

                
+
CultureInfoなどIFormatProviderを実装するインスタンスを指定してToString等を呼び出すか、ToString等を呼び出す前にThread.CurrentThread.CurrentCultureにCultureInfoを設定しておくことで、特定のカルチャでの書式や独自に定義された書式で値をフォーマットすることが出来ます。
+

                  
+
#tabpage(C#)
 
#code(cs){{
#code(cs){{
~
using System;
var dt = new DateTime(2010, 9, 14, 1, 2, 3, 456);
+
using System.Threading;
+
using System.Globalization;
+

                  
+
class Sample
+
{
+
  static void Main()
+
  {
+
    DateTime dt = new DateTime(2010, 9, 14, 1, 2, 3, 456);
 

                

                
~
    // IFormatProviderを指定しない場合
// IFormatProviderを指定しない場合
~
    // (現在のスレッドのカルチャ'ja-JP'での書式でフォーマットされる)
// (現在のスレッドのカルチャ'ja-JP'での書式でフォーマットされる)
~
    Console.WriteLine("{0} {1:U}", Thread.CurrentThread.CurrentCulture, dt);
Console.WriteLine("{0} {1:U}", Thread.CurrentThread.CurrentCulture.Name, dt);
 

                

                
~
    // Thread.CurrentThread.CurrentCultureに'en-US'のCultureInfoを指定した場合
// Thread.CurrentThread.CurrentCultureに'en-US'のCultureInfoを指定した場合
~
    // (現在のスレッドのカルチャ'en-US'での書式でフォーマットされる)
// (現在のスレッドのカルチャ'en-US'での書式でフォーマットされる)
~
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
 

                

                
~
    Console.WriteLine("{0} {1:U}", Thread.CurrentThread.CurrentCulture, dt);
Console.WriteLine("{0} {1:U}", Thread.CurrentThread.CurrentCulture.Name, dt);
 

                

                
~
    // Thread.CurrentThread.CurrentCultureに'es-ES'のCultureInfoを指定した場合
// Thread.CurrentThread.CurrentCultureに'es-ES'のCultureInfoを指定した場合
~
    // (現在のスレッドのカルチャ'es-ES'での書式でフォーマットされる)
// (現在のスレッドのカルチャ'es-ES'での書式でフォーマットされる)
~
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("es-ES");
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("es-ES");
 

                

                
~
    Console.WriteLine("{0} {1:U}", Thread.CurrentThread.CurrentCulture, dt);
Console.WriteLine("{0} {1:U}", Thread.CurrentThread.CurrentCulture.Name, dt);
 

                

                
~
    // ToStringメソッドでIFormatProviderを指定した場合
// ToString()メソッドでIFormatProviderを指定した場合
~
    // (引数で指定したIFormatProvider=カルチャ'ja-JP'での書式でフォーマットされる)
// (引数で指定したIFormatProvider=カルチャ'ja-JP'での書式でフォーマットされる)
~
    Console.WriteLine("{0} {1}", Thread.CurrentThread.CurrentCulture, dt.ToString("U", CultureInfo.GetCultureInfo("ja-JP")));
Console.WriteLine("{0} {1}", Thread.CurrentThread.CurrentCulture.Name, dt.ToString("U", CultureInfo.GetCultureInfo("ja-JP")));
 

                

                
~
    // String.FormatメソッドでIFormatProviderを指定した場合
// String.Format()メソッドでIFormatProviderを指定した場合
~
    // (上と同様、引数で指定したIFormatProvider=カルチャ'ja-JP'での書式でフォーマットされる)
// (上と同様、引数で指定したIFormatProvider=カルチャ'ja-JP'での書式でフォーマットされる)
~
    Console.WriteLine(String.Format(CultureInfo.GetCultureInfo("ja-JP"), "{0} {1:U}", Thread.CurrentThread.CurrentCulture, dt));
Console.WriteLine(String.Format(CultureInfo.GetCultureInfo("ja-JP"), "{0} {1:U}", Thread.CurrentThread.CurrentCulture, dt));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Dim dt As New DateTime(2010, 9, 14, 1, 2, 3, 456)
+

                  
+
    ' IFormatProviderを指定しない場合
+
    ' (現在のスレッドのカルチャ'ja-JP'での書式でフォーマットされる)
+
    Console.WriteLine("{0} {1:U}", Thread.CurrentThread.CurrentCulture, dt)
+

                  
+
    ' Thread.CurrentThread.CurrentCultureに'en-US'のCultureInfoを指定した場合
+
    ' (現在のスレッドのカルチャ'en-US'での書式でフォーマットされる)
+
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US")
+

                  
+
    Console.WriteLine("{0} {1:U}", Thread.CurrentThread.CurrentCulture, dt)
+

                  
+
    ' Thread.CurrentThread.CurrentCultureに'es-ES'のCultureInfoを指定した場合
+
    ' (現在のスレッドのカルチャ'es-ES'での書式でフォーマットされる)
+
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("es-ES")
+

                  
+
    Console.WriteLine("{0} {1:U}", Thread.CurrentThread.CurrentCulture, dt)
+

                  
+
    ' ToStringメソッドでIFormatProviderを指定した場合
+
    ' (引数で指定したIFormatProvider=カルチャ'ja-JP'での書式でフォーマットされる)
+
    Console.WriteLine("{0} {1}", Thread.CurrentThread.CurrentCulture, dt.ToString("U", CultureInfo.GetCultureInfo("ja-JP")))
+

                  
+
    ' String.FormatメソッドでIFormatProviderを指定した場合
+
    ' (上と同様、引数で指定したIFormatProvider=カルチャ'ja-JP'での書式でフォーマットされる)
+
    Console.WriteLine(String.Format(CultureInfo.GetCultureInfo("ja-JP"), "{0} {1:U}", Thread.CurrentThread.CurrentCulture, dt))
+
  End Sub
+
End Class
 
}}
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
 
ja-JP 2010年9月13日 16:02:03
ja-JP 2010年9月13日 16:02:03
975,40 614,29
 
es-ES 2010年9月13日 16:02:03
es-ES 2010年9月13日 16:02:03
 
}}
}}
 

                

                
~
標準の書式指定子に対応する書式や、書式化される際に使用される文字列は、CultureInfoに設定される&msdn(netfx,type,System.Globalization.NumberFormatInfo){NumberFormatInfo};や&msdn(netfx,type,System.Globalization.DateTimeFormatInfo){DateTimeFormatInfo};に設定されている値を元にして組み立てられます。 これらのクラスでは、月名・曜日名の表記や、桁区切り・小数点・通貨単位などの記号が設定されていて、これらの値を変更する事で書式をカスタマイズすることも出来ます。
**NumberFormatInfo
~

                  
(未整理) &msdn(netfx,type,System.Globalization.NumberFormatInfo){NumberFormatInfo};
+
なお、'ja'や'en'など言語コードのみを指定して作成したCultureInfo(ニュートラルカルチャのCultureInfo)には書式が設定されないため、書式プロバイダとして機能しません。 ニュートラルカルチャのCultureInfoを指定するとNotSupportedExceptionがスローされます。
 

                

                
~
スレッドとカルチャについては[[programming/netfx/locale/0_abstract]]、カルチャと書式の関係やNumberFormatInfoに設定される値などの詳細については[[programming/netfx/locale/1_infoes]]でも解説しています。
**DateTimeFormatInfo
-
(未整理) &msdn(netfx,type,System.Globalization.DateTimeFormatInfo){DateTimeFormatInfo};
 

                

                
~
**カスタム書式プロバイダ (ICustomFormatter)
**カスタム書式プロバイダ(ICustomFormatter)
~
&msdn(netfx,type,System.IFormatProvider){IFormatProviderインターフェイス};と&msdn(netfx,type,System.ICustomFormatter){ICustomFormatterインターフェイス};を実装することで、書式指定子とそれに対応する書式を独自に定義することができます。 ICustomFormatterでは書式指定子から適切な書式の文字列へと変換する処理を実装し、IFormatProviderでは変換を行うフォーマッタを取得するための処理を実装します。
&msdn(netfx,type,System.IFormatProvider){IFormatProvider};インターフェイスと&msdn(netfx,type,System.ICustomFormatter){ICustomFormatter};インターフェイスを実装することで、独自に書式を定義することができます。
 

                

                
~
数値型やDateTime型を書式化する場合、IFormatProviderからNumberFormatInfoやDateTimeFormatInfoを取得しようとします。 それ以外の型の場合や、IFormatProviderからNumberFormatInfoやDateTimeFormatInfoを取得出来なかった場合は、代わりにICustomFormatterを取得しようとします。 この時に適切なICustomFormatterを返すことで、独自に定義した書式で文字列化されることになります。
以下は、書式指定子に応じて文字列を大文字化・小文字化するカスタム書式プロバイダを実装する例です。 動作は次のとおりです。
+

                  
+
***ICustomFormatterの実装例
+
以下は、書式指定子に応じて文字列を大文字化・小文字化・タイトルケース化するカスタム書式プロバイダTextFormatProviderを実装する例です。 この例で実装しているICustomFormatter.Formatメソッドの動作は次のとおりです。
 
-引数が文字列の場合
-引数が文字列の場合
~
--書式指定子が ''U'', ''u'' の場合は、引数で指定された文字列を大文字化して返す
--書式指定子が"U", "u"の場合、引数で指定された文字列を大文字化して返す
~
--書式指定子が ''L'', ''l'' の場合は、引数で指定された文字列を小文字化して返す
--書式指定子が"L", "l"の場合、引数で指定された文字列を小文字化して返す
~
--書式指定子が ''T'', ''t'' の場合は、引数で指定された文字列をタイトルケース化して返す
--書式指定子が指定されていない場合、引数で指定された文字列をそのまま返す
+
--書式指定子が指定されていない場合は、引数で指定された文字列をそのまま返す
 
--上記以外の書式指定子の場合、FormatExceptionをスローする
--上記以外の書式指定子の場合、FormatExceptionをスローする
 
-引数が文字列以外の場合
-引数が文字列以外の場合
~
--引数がIFormattableを実装している場合は、IFormattable.ToStringの結果を返す
--引数がIFormattableを実装している場合は、IFormattable.ToString()の結果を返す
~
--引数がIFormattableを実装していない場合は、Object.ToStringの結果を返す
--引数がIFormattableを実装していない場合は、Object.ToString()の結果を返す
+

                  
+
なお、この例では大文字化・小文字化・タイトルケース化に&msdn(netfx,type,System.Globalization.TextInfo){TextInfoクラス};の&msdn(netfx,method,System.Globalization.TextInfo.ToUpper){ToUpperメソッド};・&msdn(netfx,method,System.Globalization.TextInfo.ToLower){ToLowerメソッド};・&msdn(netfx,method,System.Globalization.TextInfo.ToTitleCase){ToTitleCaseメソッド};を使っています。 TextInfoクラスについては[[programming/netfx/locale/1_infoes]]を参照してください。 また、この例で触れている[[IFormattableインターフェイスについて>#IFormattable]]は後ほど解説します。
+

                  
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
 

                

                
~
class TextFormatProvider : IFormatProvider, ICustomFormatter
#code(cs,文字列化を大文字化・小文字化するカスタム書式プロバイダ){{
~
{
class UpperLowerFormatProvider : IFormatProvider, ICustomFormatter {
~
  // IFormatProvider.GetFormatの明示的な実装
  // IFormatProvider.GetFormatの実装
~
  object IFormatProvider.GetFormat(Type formatType)
  public object GetFormat(Type formatType)
 
  {
  {
 
    if (formatType == typeof(ICustomFormatter))
    if (formatType == typeof(ICustomFormatter))
 
      // IFormatProviderにICustomFormatter型を要求された場合は自分自身を返す
      // IFormatProviderにICustomFormatter型を要求された場合は自分自身を返す
1021,24 649,18
 
  // ICustomFormatter.Formatの実装
  // ICustomFormatter.Formatの実装
 
  public string Format(string format, object arg, IFormatProvider formatProvider)
  public string Format(string format, object arg, IFormatProvider formatProvider)
 
  {
  {
~
    string argString = arg as string;
    var argString = arg as string;
 

                

                
~
    if (argString != null)
    if (argString != null) {
+
    {
 
      // 引数がstring型の場合、指定された書式に合わせて文字列化する
      // 引数がstring型の場合、指定された書式に合わせて文字列化する
~
      switch (format)
      switch (format) {
+
      {
 
        case "u":
        case "u":
~
        case "U": // 書式指定子が"U"または"u"の時は、すべて大文字にする
        case "U": // 書式指定子が"U"または"u"の時は、すべて大文字にする
~
          return CultureInfo.CurrentCulture.TextInfo.ToUpper(argString);
          return argString.ToUpper();
 

                

                
 
        case "l":
        case "l":
~
        case "L": // 書式指定子が"L"または"l"の時は、すべて小文字にする
        case "L": // 書式指定子が"L"または"l"の時は、すべて小文字にする
~
          return CultureInfo.CurrentCulture.TextInfo.ToLower(argString);
          return argString.ToLower();
+

                  
+
        case "t":
+
        case "T": // 書式指定子が"T"または"t"の時は、タイトルケースにする
+
          return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(argString);
 

                

                
 
        default:
        default:
 
          if (string.IsNullOrEmpty(format))
          if (string.IsNullOrEmpty(format))
1052,195 674,60
 

                

                
 
    // 引数がString型でない場合
    // 引数がString型でない場合
 
    if (arg is IFormattable)
    if (arg is IFormattable)
~
      // 引数がIFormattableを実装している場合は、IFormattable.ToStringメソッドで文字列化する
      // 引数がIFormattableを実装している場合は、IFormattable.ToString()メソッドで文字列化する
 
      return ((IFormattable)arg).ToString(format, formatProvider);
      return ((IFormattable)arg).ToString(format, formatProvider);
 
    else
    else
~
      // 引数がIFormattableを実装していない場合は、Object.ToStringメソッドで文字列化する
      // 引数がIFormattableを実装していない場合は、Object.ToString()メソッドで文字列化する
 
      return arg.ToString();
      return arg.ToString();
 
  }
  }
 
}
}
-
}}
 

                

                
~
class Sample
上記のカスタム書式プロバイダを使用した例は以下のとおり。
~
{
#code(cs){{
~
  static void Main()
Console.WriteLine(string.Format(new UpperLowerFormatProvider(), "{0} {0:U} {0:u} {0:L} {0:l}", "HoGe"));
~
  {
Console.WriteLine(string.Format(new UpperLowerFormatProvider(), "{0:D4} {0:F2}", 16));
~
    IFormatProvider fp = new TextFormatProvider();
Console.WriteLine(string.Format(new UpperLowerFormatProvider(), "{0:u} {0:s}", DateTime.Now));
~

                  
Console.WriteLine(DateTime.Now.ToString("u", new UpperLowerFormatProvider()));
~
    // 文字列を書式化
Console.WriteLine((72).ToString("X8", new UpperLowerFormatProvider()));
~
    Console.WriteLine(string.Format(fp, "{0} {0:U} {0:u} {0:L} {0:l} {0:T} {0:t}", "HoGe"));
try {
~
    Console.WriteLine();
  Console.WriteLine(string.Format(new UpperLowerFormatProvider(), "{0:U} {0:X}", "hoge"));
~

                  
}
~
    string text = "The quick brown fox jumps over the lazy dog";
catch (FormatException ex) {
~

                  
  Console.Error.WriteLine(ex.Message);
+
    Console.WriteLine(string.Format(fp, "{0}", text));
+
    Console.WriteLine(string.Format(fp, "{0:U}", text));
+
    Console.WriteLine(string.Format(fp, "{0:L}", text));
+
    Console.WriteLine(string.Format(fp, "{0:T}", text));
+
    Console.WriteLine();
+

                  
+
    // int型の値を書式化
+
    int intValue = 42;
+

                  
+
    Console.WriteLine(string.Format(fp, "{0:D4} {0:F2}", intValue));
+
    Console.WriteLine(intValue.ToString("X8", fp));
+
    Console.WriteLine();
+

                  
+
    // DateTime型の値を書式化
+
    DateTime dateTimeValue = new DateTime(2010, 9, 14, 1, 2, 3);
+

                  
+
    Console.WriteLine(string.Format(fp, "{0:u} {0:s}", dateTimeValue));
+
    Console.WriteLine(dateTimeValue.ToString("r", fp));
+
    Console.WriteLine();
+

                  
+
    // 不正な書式を指定
+
    try
+
    {
+
      Console.WriteLine(string.Format(fp, "{0:U} {0:X}", "HoGe"));
+
    }
+
    catch (FormatException ex)
+
    {
+
      Console.Error.WriteLine(ex.Message);
+
    }
+
  }
 
}
}
 
}}
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

                  
+
Class TextFormatProvider
+
  Implements IFormatProvider, ICustomFormatter
+

                  
+
  ' IFormatProvider.GetFormatの実装
+
  Private Function GetFormat(ByVal formatType As Type) As Object Implements IFormatProvider.GetFormat
+
    If GetType(ICustomFormatter).Equals(formatType) Then
+
      ' IFormatProviderにICustomFormatter型を要求された場合は自分自身を返す
+
      Return Me
+
    Else
+
      ' それ以外の場合はNothingを返す
+
      Return Nothing
+
    End If
+
  End Function
+

                  
+
  ' ICustomFormatter.Formatの実装
+
  Public Function Format(ByVal format As String, ByVal arg As Object, ByVal formatProvider As IFormatProvider) As String Implements ICustomFormatter.Format
+
    Dim argString As String = TryCast(arg, String)
+

                  
+
    If argString IsNot Nothing Then
+
      ' 引数がstring型の場合、指定された書式に合わせて文字列化する
+
      Select Case format
+
        Case "u", "U" ' 書式指定子が"U"または"u"の時は、すべて大文字にする
+
          Return CultureInfo.CurrentCulture.TextInfo.ToUpper(argString)
+

                  
+
        Case "l", "L" ' 書式指定子が"L"または"l"の時は、すべて小文字にする
+
          Return CultureInfo.CurrentCulture.TextInfo.ToLower(argString)
+

                  
+
        Case "t", "T" ' 書式指定子が"T"または"t"の時は、タイトルケースにする
+
          Return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(argString)
+

                  
+
        Case Else
+
          If String.IsNullOrEmpty(format) Then
+
            ' 書式指定子が指定されていない場合は、そのままにする
+
            Return argString
+
          Else
+
            ' それ以外の書式指定子の場合は、FormatExceptionをスローする
+
            Throw New FormatException(string.Format("'{0}'は不正な書式指定子です", format))
+
          End If
+
      End Select
+
    End If
+

                  
+
    ' 引数がString型でない場合
+
    If TypeOf arg Is IFormattable Then
+
      ' 引数がIFormattableを実装している場合は、IFormattable.ToStringメソッドで文字列化する
+
      Return CType(arg, IFormattable).ToString(format, formatProvider)
+
    Else
+
      ' 引数がIFormattableを実装していない場合は、Object.ToStringメソッドで文字列化する
+
      Return arg.ToString()
+
    End If
+
  End Function
+
End Class
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Dim fp As New TextFormatProvider()
+

                  
+
    ' 文字列を書式化
+
    Console.WriteLine(String.Format(fp, "{0} {0:U} {0:u} {0:L} {0:l} {0:T} {0:t}", "HoGe"))
+
    Console.WriteLine()
+

                  
+
    Dim text As String = "The quick brown fox jumps over the lazy dog"
+

                  
+
    Console.WriteLine(String.Format(fp, "{0}", text))
+
    Console.WriteLine(String.Format(fp, "{0:U}", text))
+
    Console.WriteLine(String.Format(fp, "{0:L}", text))
+
    Console.WriteLine(String.Format(fp, "{0:T}", text))
+
    Console.WriteLine()
+

                  
+
    ' Integer型の値を書式化
+
    Dim intValue As Integer = 42
+

                  
+
    Console.WriteLine(String.Format(fp, "{0:D4} {0:F2}", intValue))
+
    Console.WriteLine(intValue.ToString("X8", fp))
+
    Console.WriteLine()
+

                  
+
    ' DateTime型の値を書式化
+
    Dim dateTimeValue As New DateTime(2010, 9, 14, 1, 2, 3)
+

                  
+
    Console.WriteLine(String.Format(fp, "{0:u} {0:s}", dateTimeValue))
+
    Console.WriteLine(dateTimeValue.ToString("r", fp))
+
    Console.WriteLine()
+

                  
+
    ' 不正な書式を指定
+
    Try
+
      Console.WriteLine(String.Format(fp, "{0:U} {0:X}", "HoGe"))
+
    Catch ex As FormatException
+
      Console.Error.WriteLine(ex.Message)
+
    End Try
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
~
HoGe HOGE HOGE hoge hoge Hoge Hoge
HoGe HOGE HOGE hoge hoge
~

                  
0016 16.00
+
The quick brown fox jumps over the lazy dog
+
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
+
the quick brown fox jumps over the lazy dog
+
The Quick Brown Fox Jumps Over The Lazy Dog
+

                  
+
0042 42.00
+
0000002A
+

                  
 
2010-09-14 01:02:03Z 2010-09-14T01:02:03
2010-09-14 01:02:03Z 2010-09-14T01:02:03
~
Tue, 14 Sep 2010 01:02:03 GMT
2010-09-14 01:02:03Z
~

                  
00000048
 
'X'は不正な書式指定子です
'X'は不正な書式指定子です
 
}}
}}
 

                

                
~
*&aname(IFormattable){書式を指定した文字列化のサポート}; (IFormattable)
*書式を指定した文字列化のサポート (IFormattable)
~
&msdn(netfx,type,System.IFormattable){IFormattableインターフェイス};を実装すると、独自に定義した書式で文字列化するToStringメソッドを用意することができます。 int, double, DateTime等の基本型はIFormattableインターフェイスを実装していて、これにより書式を指定して文字列化できるようになっています。
&msdn(netfx,type,System.IFormattable){IFormattableインターフェイス};を実装すると、独自に定義した書式で文字列化するToString()メソッドを用意することができます。 int, double, DateTime等の基本型はIFormattableインターフェイスを実装していて、これにより書式を指定して文字列化できるようになっています。
+

                  
 
ICustomFormatterでは書式化の実装を書式化したい型とは別のクラスで実装するのに対し、IFormattableでは書式化の実装を書式化したい型自体に実装することができます。
ICustomFormatterでは書式化の実装を書式化したい型とは別のクラスで実装するのに対し、IFormattableでは書式化の実装を書式化したい型自体に実装することができます。
 

                

                
 
以下は、複素数型Complexを用意し、IFormattableで書式化処理を実装する例です。 この例では次の書式指定子をサポートします。
以下は、複素数型Complexを用意し、IFormattableで書式化処理を実装する例です。 この例では次の書式指定子をサポートします。
~
:G'''n'''|精度'''n'''のガウス平面座標表示。 "(a, b)"の形式。
:G|ガウス平面座標表示。 "(a, b)"の形式。
~
:A'''n'''|精度'''n'''の絶対値表示。 |z|の値の形式。
:A|絶対値表示。 |z|の値の形式。
~
:C'''n'''|精度'''n'''の直交座標表示。"a±bi"の形式。 実部・虚部が0の場合は表示しない。
:C|直交座標表示。"a±bi"の形式。 実部・虚部が0の場合は表示しない。
~
:P'''n'''|精度'''n'''の極座標表示。 "r∠θ"の形式。
:P|極座標表示。 "r∠θ"の形式。
-

                  
-
#code(cs,IFormattableを実装した構造体型Complex){{
-
struct Complex : IFormattable {
-
  // 実部
-
  public double Real {
-
    get; set;
-
  }
 

                

                
~
なお、この例では書式指定子で精度'''n'''が省略された場合は書式指定子 ''F'' のデフォルトの精度で文字列化します。 また、double型の値を書式指定子 ''F'' で文字列化する際に、引数で渡されたIFormatProviderを使って書式化するようにしています。 そのため、CultureInfoが渡された場合はそのカルチャでの書式に従って文字列化されます。
  // 虚部
~

                  
  public double Imaginary {
~
#tabpage(C#)
    get; set;
~
#code(cs){{
  }
+
using System;
+
using System.Globalization;
+

                  
+
struct Complex : IFormattable
+
{
+
  public double Real; // 実部
+
  public double Imaginary; // 虚部
 

                

                
 
  public Complex(double real, double imaginary)
  public Complex(double real, double imaginary)
 
    : this()
    : this()
1252,51 739,52
 
  // Object.ToStringのオーバーライド
  // Object.ToStringのオーバーライド
 
  public override string ToString()
  public override string ToString()
 
  {
  {
~
    // 書式・書式プロバイダを指定せずにToStringを呼ぶ
    // 書式・書式プロバイダを指定せずにToString()を呼ぶ
 
    return ToString(null, null);
    return ToString(null, null);
 
  }
  }
 

                

                
 
  public string ToString(string format)
  public string ToString(string format)
 
  {
  {
~
    // 書式プロバイダを指定せずにToStringを呼ぶ
    // 書式プロバイダを指定せずにToString()を呼ぶ
 
    return ToString(format, null);
    return ToString(format, null);
 
  }
  }
 

                

                
 
  // IFormattable.ToString(string, IFormatProvider)の実装
  // IFormattable.ToString(string, IFormatProvider)の実装
 
  public string ToString(string format, IFormatProvider formatProvider)
  public string ToString(string format, IFormatProvider formatProvider)
 
  {
  {
~
    if (string.IsNullOrEmpty(format)) format = "G"; // 指定されていない場合は"G"の書式を使用
    if (string.IsNullOrEmpty(format))
-
      format = "G"; // 指定されていない場合は"G"の書式を使用
 

                

                
~
    char f = format[0]; // 書式指定文字列の1文字目で書式の種類を分ける
    var f = format[0]; // 書式指定文字列の1文字目で種類を分ける
~
    string acc = format.Substring(1); // 書式指定文字列の2文字目以降を精度として扱う
    var acc = format.Substring(1); // 書式指定文字列の2文字目以降を精度として扱う
 

                

                
 
    switch (f) {
    switch (f) {
 
      case 'G': // ガウス平面座標表示
      case 'G': // ガウス平面座標表示
 
        return string.Format(formatProvider, "({0:F" + acc + "}, {1:F" + acc + "})", Real, Imaginary);
        return string.Format(formatProvider, "({0:F" + acc + "}, {1:F" + acc + "})", Real, Imaginary);
 

                

                
 
      case 'A': // 絶対値表示
      case 'A': // 絶対値表示
~
        return Math.Sqrt(Real * Real + Imaginary * Imaginary).ToString("F" + acc, formatProvider);
        return Math.Pow(Real * Real + Imaginary * Imaginary, 0.5).ToString("F" + acc, formatProvider);
-

                  
-
      case 'C': { // 直交形式表示
-
        string realPart;
-

                  
-
        if (Real == 0.0)
-
          realPart = null;
-
        else
-
          realPart = Real.ToString("F" + acc, formatProvider);
 

                

                
+
      case 'C': // 直交形式表示
+
      {
+
        // 実部の値が0の場合は表示しない
+
        string realPart = (Real == 0.0) ? null : Real.ToString("F" + acc, formatProvider);
 
        string imaginaryPart;
        string imaginaryPart;
 
        string sign;
        string sign;
 

                

                
~
        if (Imaginary == 0.0)
        if (Imaginary == 0.0) {
+
        {
+
          // 虚部の値が0の場合は表示しない
 
          imaginaryPart = null;
          imaginaryPart = null;
 
          sign = null;
          sign = null;
 
        }
        }
~
        else if (0.0 < Imaginary)
        else if (0 < Imaginary) {
+
        {
 
          imaginaryPart = Imaginary.ToString("F" + acc, formatProvider) + "i";
          imaginaryPart = Imaginary.ToString("F" + acc, formatProvider) + "i";
~
          sign = (realPart == null) ? null : "+"; // 実部を表示する場合のみ符号を付ける
          sign = (realPart == null) ? null : "+";
 
        }
        }
~
        else /*if (Imaginary < 0.0)*/
        else { /*if (Imaginary < 0)*/
+
        {
 
          imaginaryPart = (-Imaginary).ToString("F" + acc, formatProvider) + "i";
          imaginaryPart = (-Imaginary).ToString("F" + acc, formatProvider) + "i";
 
          sign = "-";
          sign = "-";
 
        }
        }
1304,10 792,9
 
        return string.Concat(realPart, sign, imaginaryPart);
        return string.Concat(realPart, sign, imaginaryPart);
 
      }
      }
 

                

                
~
      case 'P': // 極形式表示
      case 'P': { // 極形式表示
~
      {
        var r = Math.Pow(Real * Real + Imaginary * Imaginary, 0.5);
~
        double r = Math.Sqrt(Real * Real + Imaginary * Imaginary);
        var t = Math.Atan2(Imaginary, Real) / Math.PI;
+
        double t = Math.Atan2(Imaginary, Real) / Math.PI;
 

                

                
 
        return string.Format(formatProvider, "{0:F" + acc + "}∠{1:F" + acc + "}π", r, t);
        return string.Format(formatProvider, "{0:F" + acc + "}∠{1:F" + acc + "}π", r, t);
 
      }
      }
1317,162 804,45
 
    }
    }
 
  }
  }
 
}
}
-
}}
 

                

                
~
class Sample
上記の構造体を使用した例は以下のとおり。
~
{
#code(cs){{
~
  static void Main()
Console.WriteLine("{0}, {0:G}, {0:A}, {0:C1}, {0:P6}", (new Complex(4.0, 3.0)));
+
  {
+
    Console.WriteLine("{0}, {0:G}, {0:A}, {0:C1}, {0:P6}", (new Complex(4.0, 3.0)));
 

                

                
~
    Console.WriteLine();
Console.WriteLine();
~
    Console.WriteLine((new Complex( 3.000,  4.000)).ToString());
Console.WriteLine((new Complex( 3.000,  4.000)).ToString());
~
    Console.WriteLine((new Complex( 1.414,  1.414)).ToString());
Console.WriteLine((new Complex( 1.414,  1.414)).ToString());
~
    Console.WriteLine((new Complex( 3.000,  4.000)).ToString("G", CultureInfo.GetCultureInfo("ja-JP")));
Console.WriteLine((new Complex( 3.000,  4.000)).ToString("G", CultureInfo.GetCultureInfo("ja-JP")));
~
    Console.WriteLine((new Complex(-1.414,  1.414)).ToString("G4", CultureInfo.GetCultureInfo("en-US")));
Console.WriteLine((new Complex(-1.414,  1.414)).ToString("G4", CultureInfo.GetCultureInfo("en-US")));
~
    Console.WriteLine((new Complex( 0.000,  1.000)).ToString("G12", CultureInfo.GetCultureInfo("fr-FR")));
Console.WriteLine((new Complex( 0.000,  1.000)).ToString("G12", CultureInfo.GetCultureInfo("fr-FR")));
~

                  

                  
~
    Console.WriteLine();
Console.WriteLine();
~
    Console.WriteLine((new Complex( 3.000,  4.000)).ToString("A"));
Console.WriteLine((new Complex( 3.000,  4.000)).ToString("A"));
~
    Console.WriteLine((new Complex(-4.000, -3.000)).ToString("A4", CultureInfo.GetCultureInfo("ja-JP")));
Console.WriteLine((new Complex(-4.000, -3.000)).ToString("A4", CultureInfo.GetCultureInfo("ja-JP")));
~
    Console.WriteLine((new Complex( 1.000, -1.000)).ToString("A1", CultureInfo.GetCultureInfo("en-US")));
Console.WriteLine((new Complex( 1.000, -1.000)).ToString("A1", CultureInfo.GetCultureInfo("en-US")));
~
    Console.WriteLine((new Complex( 2.000,  0.000)).ToString("A1", CultureInfo.GetCultureInfo("fr-FR")));
Console.WriteLine((new Complex( 2.000,  0.000)).ToString("A1", CultureInfo.GetCultureInfo("fr-FR")));
~

                  

                  
~
    Console.WriteLine();
Console.WriteLine();
~
    Console.WriteLine((new Complex( 3.000,  4.000)).ToString("C"));
Console.WriteLine((new Complex( 3.000,  4.000)).ToString("C"));
~
    Console.WriteLine((new Complex(-0.707,  0.707)).ToString("C2"));
Console.WriteLine((new Complex(-0.707,  0.707)).ToString("C2"));
~
    Console.WriteLine((new Complex( 0.707, -0.707)).ToString("C2"));
Console.WriteLine((new Complex( 0.707, -0.707)).ToString("C2"));
~
    Console.WriteLine((new Complex( 1.000,  0.000)).ToString("C1"));
Console.WriteLine((new Complex( 1.000,  0.000)).ToString("C1"));
~
    Console.WriteLine((new Complex(-1.000,  0.000)).ToString("C1", CultureInfo.GetCultureInfo("ja-JP")));
Console.WriteLine((new Complex(-1.000,  0.000)).ToString("C1", CultureInfo.GetCultureInfo("ja-JP")));
~
    Console.WriteLine((new Complex( 0.000,  1.000)).ToString("C1", CultureInfo.GetCultureInfo("en-US")));
Console.WriteLine((new Complex( 0.000,  1.000)).ToString("C1", CultureInfo.GetCultureInfo("en-US")));
~
    Console.WriteLine((new Complex( 0.000, -1.000)).ToString("C1", CultureInfo.GetCultureInfo("fr-FR")));
Console.WriteLine((new Complex( 0.000, -1.000)).ToString("C1", CultureInfo.GetCultureInfo("fr-FR")));
~
    Console.WriteLine((new Complex( 1.000,  1.000)).ToString("C1"));
Console.WriteLine((new Complex( 1.000,  1.000)).ToString("C1"));
~
    Console.WriteLine((new Complex( 1.000, -1.000)).ToString("C1"));
Console.WriteLine((new Complex( 1.000, -1.000)).ToString("C1"));
~

                  

                  
~
    Console.WriteLine();
Console.WriteLine();
~
    Console.WriteLine((new Complex( 1.000,  0.000)).ToString("P3"));
Console.WriteLine((new Complex( 1.000,  0.000)).ToString("P3"));
~
    Console.WriteLine((new Complex( 1.414,  1.414)).ToString("P3"));
Console.WriteLine((new Complex( 1.414,  1.414)).ToString("P3"));
~
    Console.WriteLine((new Complex( 0.000,  1.000)).ToString("P3", CultureInfo.GetCultureInfo("ja-JP")));
Console.WriteLine((new Complex( 0.000,  1.000)).ToString("P3", CultureInfo.GetCultureInfo("ja-JP")));
~
    Console.WriteLine((new Complex(-1.000,  0.000)).ToString("P3", CultureInfo.GetCultureInfo("en-US")));
Console.WriteLine((new Complex(-1.000,  0.000)).ToString("P3", CultureInfo.GetCultureInfo("en-US")));
~
    Console.WriteLine((new Complex( 0.000, -1.000)).ToString("P3", CultureInfo.GetCultureInfo("fr-FR")));
Console.WriteLine((new Complex( 0.000, -1.000)).ToString("P3", CultureInfo.GetCultureInfo("fr-FR")));
~
    Console.WriteLine((new Complex( 0.000,  0.000)).ToString("P3"));
Console.WriteLine((new Complex( 0.000,  0.000)).ToString("P3"));
~
    Console.WriteLine((new Complex(-3.000,  4.000)).ToString("P3"));
Console.WriteLine((new Complex(-3.000,  4.000)).ToString("P3"));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+

                  
+
Structure Complex
+
  Implements IFormattable
+

                  
+
  Public Real As Double ' 実部
+
  Public Imaginary As Double ' 虚部
+

                  
+
  Public Sub New(ByVal real As Double, ByVal imaginary As Double)
+
    MyClass.Real = real
+
    MyClass.Imaginary = imaginary
+
  End Sub
+

                  
+
  ' Object.ToStringのオーバーライド
+
  Public Overrides Function ToString() As String
+
    ' 書式・書式プロバイダを指定せずにToStringを呼ぶ
+
    Return ToString(Nothing, Nothing)
+
  End Function
+

                  
+
  Public Function ToString(ByVal format As String) As String
+
    ' 書式プロバイダを指定せずにToStringを呼ぶ
+
    Return ToString(format, Nothing)
+
  End Function
+

                  
+
  ' IFormattable.ToString(string, IFormatProvider)の実装
+
  Public Function ToString(ByVal format As String, ByVal formatProvider As IFormatProvider) As String Implements IFormattable.ToString
+
    If String.IsNullOrEmpty(format) Then format = "G" ' 指定されていない場合は"G"の書式を使用
+

                  
+
    Dim f As Char = format(0) ' 書式指定文字列の1文字目で書式の種類を分ける
+
    Dim acc As String = format.Substring(1) ' 書式指定文字列の2文字目以降を精度として扱う
+

                  
+
    Select Case f
+
      Case "G"c ' ガウス平面座標表示
+
        Return String.Format(formatProvider, "({0:F" + acc + "}, {1:F" + acc + "})", Real, Imaginary)
+

                  
+
      Case "A"c ' 絶対値表示
+
        Return Math.Sqrt(Real * Real + Imaginary * Imaginary).ToString("F" + acc, formatProvider)
+

                  
+
      Case "C"c ' 直交形式表示
+
        ' 実部の値が0の場合は表示しない
+
        Dim realPart As String = If (Real = 0.0, Nothing, Real.ToString("F" + acc, formatProvider))
+

                  
+
        Dim imaginaryPart As String
+
        Dim sign As String
+

                  
+
        If Imaginary = 0.0
+
          ' 虚部の値が0の場合は表示しない
+
          imaginaryPart = Nothing
+
          sign = Nothing
+
        Else If 0.0 < Imaginary
+
          imaginaryPart = Imaginary.ToString("F" + acc, formatProvider) + "i"
+
          sign = If(realPart Is Nothing, Nothing, "+") ' 実部を表示する場合のみ符号を付ける
+
        Else ' If Imaginary < 0.0
+
          imaginaryPart = (-Imaginary).ToString("F" + acc, formatProvider) + "i"
+
          sign = "-"
+
        End If
+

                  
+
        Return String.Concat(realPart, sign, imaginaryPart)
+

                  
+
      Case "P"c: ' 極形式表示
+
        Dim r As Double = Math.Sqrt(Real * Real + Imaginary * Imaginary)
+
        Dim t As Double = Math.Atan2(Imaginary, Real) / Math.PI
+

                  
+
        Return String.Format(formatProvider, "{0:F" + acc + "}∠{1:F" + acc + "}π", r, t)
+

                  
+
      Case Else
+
        Throw New FormatException(String.Format("'{0}'は不正な書式指定子です", format))
+
    End Select
+
  End Function
+
End Structure
+

                  
+
Class Sample
+
  Shared Sub Main()
+
    Console.WriteLine("{0}, {0:G}, {0:A}, {0:C1}, {0:P6}", (New Complex(4.0, 3.0)))
+

                  
+
    Console.WriteLine()
+
    Console.WriteLine((New Complex( 3.000,  4.000)).ToString())
+
    Console.WriteLine((New Complex( 1.414,  1.414)).ToString())
+
    Console.WriteLine((New Complex( 3.000,  4.000)).ToString("G", CultureInfo.GetCultureInfo("ja-JP")))
+
    Console.WriteLine((New Complex(-1.414,  1.414)).ToString("G4", CultureInfo.GetCultureInfo("en-US")))
+
    Console.WriteLine((New Complex( 0.000,  1.000)).ToString("G12", CultureInfo.GetCultureInfo("fr-FR")))
+

                  
+
    Console.WriteLine()
+
    Console.WriteLine((New Complex( 3.000,  4.000)).ToString("A"))
+
    Console.WriteLine((New Complex(-4.000, -3.000)).ToString("A4", CultureInfo.GetCultureInfo("ja-JP")))
+
    Console.WriteLine((New Complex( 1.000, -1.000)).ToString("A1", CultureInfo.GetCultureInfo("en-US")))
+
    Console.WriteLine((New Complex( 2.000,  0.000)).ToString("A1", CultureInfo.GetCultureInfo("fr-FR")))
+

                  
+
    Console.WriteLine()
+
    Console.WriteLine((New Complex( 3.000,  4.000)).ToString("C"))
+
    Console.WriteLine((New Complex(-0.707,  0.707)).ToString("C2"))
+
    Console.WriteLine((New Complex( 0.707, -0.707)).ToString("C2"))
+
    Console.WriteLine((New Complex( 1.000,  0.000)).ToString("C1"))
+
    Console.WriteLine((New Complex(-1.000,  0.000)).ToString("C1", CultureInfo.GetCultureInfo("ja-JP")))
+
    Console.WriteLine((New Complex( 0.000,  1.000)).ToString("C1", CultureInfo.GetCultureInfo("en-US")))
+
    Console.WriteLine((New Complex( 0.000, -1.000)).ToString("C1", CultureInfo.GetCultureInfo("fr-FR")))
+
    Console.WriteLine((New Complex( 1.000,  1.000)).ToString("C1"))
+
    Console.WriteLine((New Complex( 1.000, -1.000)).ToString("C1"))
+

                  
+
    Console.WriteLine()
+
    Console.WriteLine((New Complex( 1.000,  0.000)).ToString("P3"))
+
    Console.WriteLine((New Complex( 1.414,  1.414)).ToString("P3"))
+
    Console.WriteLine((New Complex( 0.000,  1.000)).ToString("P3", CultureInfo.GetCultureInfo("ja-JP")))
+
    Console.WriteLine((New Complex(-1.000,  0.000)).ToString("P3", CultureInfo.GetCultureInfo("en-US")))
+
    Console.WriteLine((New Complex( 0.000, -1.000)).ToString("P3", CultureInfo.GetCultureInfo("fr-FR")))
+
    Console.WriteLine((New Complex( 0.000,  0.000)).ToString("P3"))
+
    Console.WriteLine((New Complex(-3.000,  4.000)).ToString("P3"))
+
  End Sub
+
End Class
 
}}
}}
+
#tabpage-end
 

                

                
 
#prompt{{
#prompt{{
 
(4.00, 3.00), (4.00, 3.00), 5.00, 4.0+3.0i, 5.000000∠0.204833π
(4.00, 3.00), (4.00, 3.00), 5.00, 4.0+3.0i, 5.000000∠0.204833π