この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

String.Format メソッド

 

公開日: 2016年7月

指定された形式に基づいてオブジェクトの値を文字列に変換し、別の文字列に挿入します。

初めて使用する場合、String.Formatメソッドを参照してください、String.Format メソッドの使用を開始する概要セクションです。

参照してください、解説すべてに関する完全なドキュメントのセクションString.Formatオーバー ロードします。

名前空間:   System
アセンブリ:  mscorlib (mscorlib.dll 内)

名前説明
System_CAPS_pubmethodSystem_CAPS_staticFormat(IFormatProvider, String, Object)

指定した文字列の 1 つまたは複数の書式項目を、対応するオブジェクトの文字列形式に置換します。 パラメーターにより、カルチャに固有の書式情報が指定されます。

System_CAPS_pubmethodSystem_CAPS_staticFormat(IFormatProvider, String, Object, Object)

指定した文字列の書式項目を、指定した 2 つのオブジェクトの文字列形式に置換します。 パラメーターは、カルチャ固有の書式情報を指定します。

System_CAPS_pubmethodSystem_CAPS_staticFormat(IFormatProvider, String, Object, Object, Object)

指定した文字列の書式項目を、指定した 3 つのオブジェクトの文字列形式に置換します。 パラメーターにより、カルチャに固有の書式設定情報を指定します。

System_CAPS_pubmethodSystem_CAPS_staticFormat(IFormatProvider, String, Object[])

指定した文字列の書式項目を、指定した配列内の対応するオブジェクトの文字列表記に置換します。 パラメーターにより、カルチャ固有の書式情報が指定されます。

System_CAPS_pubmethodSystem_CAPS_staticFormat(String, Object)

指定された文字列の 1 つ以上の書式項目を、指定されたオブジェクトの文字列表記に置換します。

System_CAPS_pubmethodSystem_CAPS_staticFormat(String, Object, Object)

指定した文字列の書式項目を、指定した 2 つのオブジェクトの文字列形式に置換します。

System_CAPS_pubmethodSystem_CAPS_staticFormat(String, Object, Object, Object)

指定した文字列の書式項目を、指定した 3 つのオブジェクトの文字列形式に置換します。

System_CAPS_pubmethodSystem_CAPS_staticFormat(String, Object[])

指定した文字列の書式項目を、指定した配列内の対応するオブジェクトの文字列形式に置換します。

使用するString.Formatオブジェクト、変数、または式の値を別の文字列に挿入する必要がある場合。 値を挿入するなど、Decimalに 1 つの文字列としてユーザーに表示する文字列値。

Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0} per ounce.",
                         pricePerOunce);
// Result: The current price is 17.36 per ounce.

その値の書式を制御することができます。

Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0:C2} per ounce.",
                         pricePerOunce);
// Result if current culture is en-US:
//      The current price is $17.36 per ounce.

書式設定、以外に配置と間隔を制御することもできます。

文字列を挿入します。

String.Format書式指定文字列を続けてオブジェクトまたは文字列に変換および書式指定文字列の指定した位置に挿入される式の 1 つまたは複数を開始します。 例:

decimal temp = 20.4m;
string s = String.Format("The temperature is {0}°C.", temp);
Console.WriteLine(s);
// Displays 'The temperature is 20.4°C.'

{0}形式の文字列は、書式指定項目。 0文字列値を持つはその位置に挿入するオブジェクトのインデックスです。 (インデックスは、0 から始まります)。 挿入されるオブジェクトが、文字列ではない場合、ToString結果の文字列に挿入する前にいずれかに変換するメソッドが呼び出されます。

オブジェクトの一覧で 2 つの書式指定項目と 2 つのオブジェクトを使用する別の例を次に示します。

string s = String.Format("At {0}, the temperature is {1}°C.",
                         DateTime.Now, 20.4);
// Output similar to: 'At 4/10/2015 9:29:41 AM, the temperature is 20.4°C.'

多くの書式項目を持つことができ、数のオブジェクトとオブジェクトの一覧で、各書式項目のインデックスには、オブジェクト リストに一致するオブジェクトが含まれている限りです。 する必要はありません心配のどのオーバー ロードに関する次の操作を呼び出します。コンパイラを適切なものを選択します。

書式設定の制御

オブジェクトを書式設定する方法を制御する書式指定文字列の書式指定項目内のインデックスを行うことができます。 たとえば、 {0:d} "d"書式指定文字列をオブジェクトの一覧の最初のオブジェクトに適用されます。 単一のオブジェクトでの使用例を次に示し、2 つのアイテムの書式設定します。

string s = String.Format("It is now {0:d} at {0:t}", DateTime.Now);
// Output similar to: 'It is now 4/10/2015 at 10:04 AM'

型のサポートの数値書式指定文字列、すべての数値型を含む (両方標準カスタム書式指定文字列)、すべての日付と時刻 (両方標準カスタム書式指定文字列) と時間間隔 (両方標準カスタム書式指定文字列)、すべての列挙型列挙型、およびGUIDsです。 独自の型に書式指定文字列のサポートを追加することもできます。

間隔を制御します。

などの構文を使用して、結果の文字列に挿入する文字列の幅を定義する{0,12}、12 文字の文字列を挿入します。 ここでは、最初のオブジェクトの文字列形式は右揃えで 12 文字のフィールドです。 (最初のオブジェクトの文字列形式が複数の 12 文字である場合は、ただし、推奨されるフィールドの幅は無視され、文字列全体が、結果の文字列に挿入します。)

次の例では、文字列を保持する、6 文字のフィールド"Year"と年の一部の文字列だけでなく、15 文字のフィールド"Population"文字列を保持して人口データの一部です。 文字がある右揃えのフィールドに注意してください。

int[] years = { 2013, 2014, 2015 };
int[] population = { 1025632, 1105967, 1148203 };
String s = String.Format("{0,6} {1,15}\n\n", "Year", "Population");
for(int index = 0; index < years.Length; index++)
   s += String.Format("{0,6} {1,15:N0}\n",
                      years[index], population[index]);
// Result:
//      Year      Population
//
//      2013       1,025,632
//      2014       1,105,967
//      2015       1,148,203
配置を制御します。

既定では、文字列は、そのフィールド内で右揃えのフィールド幅を指定する場合。 フィールドに文字列を左揃えにするを先頭に負の符号とフィールドの幅など{0,-12}12 文字の右揃えのフィールドを定義します。

次の例は、それを左揃えのラベルとデータの両方する点を除いて、1 つ前に似ています。

int[] years = { 2013, 2014, 2015 };
int[] population = { 1025632, 1105967, 1148203 };
String s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population");
for(int index = 0; index < years.Length; index++)
   s += String.Format("{0,-10} {1,-10:N0}\n",
                      years[index], population[index]);
// Result:
//    Year       Population
//
//    2013       1,025,632
//    2014       1,105,967
//    2015       1,148,203

String.Format複合書式指定機能を利用します。 詳細については、「複合書式指定」を参照してください。

オーバー ロードを選択するための追加のガイダンスについては、次を参照してくださいどのメソッドが呼び出ししますか?。

String String.Format(String format, Object arg0)

書式項目を指定したオブジェクトの文字列形式に置き換えます ()。

String String.Format(String format, Object arg0, Object arg1)

書式項目を 2 つのオブジェクトの文字列形式に置き換えます ()。

String String.Format(String format, Object arg0, Object arg1, Object arg2)

書式項目を 3 つの指定したオブジェクトの文字列形式に置き換えます ()。

String String.Format(String format, params Object[] args)

指定した配列内の対応するオブジェクトの文字列形式の書式項目置換 ()。

String String.Format(IFormatProvider provider, String format, params Object[] args)

書式項目を指定した配列内の対応するオブジェクトの文字列形式に置換し、指定したカルチャに固有の書式情報を使用して () またはカスタム情報を書式設定 ()。

これは、パラメーターの完全な一覧、Formatメソッド; 各オーバー ロードによって使用されるパラメーターの上記のオーバー ロードの構文を参照してください。 のみ、formatパラメーターは、すべてのオーバー ロードを使用します。

パラメーター

Type

説明

format

String

1 つまたは複数の書式項目を含む複合書式指定文字列 (を参照してください書式指定項目)。

arg0

String

最初のページまたは書式指定するオブジェクトのみです。

arg1

String

2 番目に書式設定するオブジェクト。

arg2

String

3 番目に書式設定するオブジェクト。

args

String[]

0 個以上のオブジェクトを書式設定すると、コンマ区切りの一覧で、または配列として指定します。

provider

IFormatProvider

カスタムまたはカルチャに固有の書式情報を提供するオブジェクト。

型: String
のコピーformatされる書式指定項目に置換された対応する引数の文字列形式。

Exception

Condition

によってスローされます。

ArgumentNullException

formatnull です。

すべてのオーバー ロードします。

FormatException

format が正しくありません。

または

書式指定項目のインデックスは、ゼロ未満、またはより大きいか、引数リスト内の引数の数と同じです。

すべてのオーバー ロードします。

To

Call

現在のカルチャの規則を使用して 1 つまたは複数のオブジェクトの書式設定します。

含むオーバー ロードを除く、providerパラメーター、残りのFormatオーバー ロードが含まれて、Stringパラメーターの後に 1 つまたは複数のオブジェクトのパラメーターです。 このためを決定する必要はありませんFormatオーバー ロードを呼び出そうとします。 言語コンパイラがないオーバー ロードの中から適切なオーバー ロードを選択して、provider引数リストに基づくパラメーター。 たとえば、引数リストに 5 つの引数がある場合、コンパイラが呼び出す、Format(String, Object[])メソッドです。

特定のカルチャの規則を使用して 1 つまたは複数のオブジェクトの書式設定します。

Formatオーバー ロードで始まり、providerパラメーターの後に、Stringパラメーターと 1 つまたは複数オブジェクトのパラメーターです。 このためはどの固有の仕様を決定する必要はありませんFormatオーバー ロードを呼び出そうとします。 言語コンパイラがオーバー ロードの中から適切なオーバー ロードを選択して、provider引数リストに基づくパラメーター。 たとえば、引数リストに 5 つの引数がある場合、コンパイラが呼び出す、Format(IFormatProvider, String, Object[])メソッドです。

いずれかで、カスタムの書式設定操作を実行、ICustomFormatter実装またはIFormattable実装します。

持つ 4 つのオーバー ロードのいずれか、providerパラメーター。 コンパイラを持つオーバー ロードの中から適切なオーバー ロードを選択して、provider引数リストに基づくパラメーター。

各オーバー ロード、Formatメソッドを使用、複合書式指定機能を 0 から始まるインデックス付きプレース ホルダーを含む、複合書式指定文字列の書式指定項目と呼ばれます。 実行時に、各書式項目は、パラメーター リスト内の対応する引数の文字列形式に置き換えられます。 引数の値が場合null、書式指定項目が置き換えString.Emptyです。 たとえば、次の呼び出し、Format(String, Object, Object, Object)メソッドには、次の 3 つの書式項目と {0}、{1}、{2}、書式指定文字列と 3 つの項目を含む引数のリストが含まれています。

DateTime dat = new DateTime(2012, 1, 17, 9, 30, 0); 
string city = "Chicago";
int temp = -16;
string output = String.Format("At {0} in {1}, the temperature was {2} degrees.",
                              dat, city, temp);
Console.WriteLine(output);
// The example displays the following output:
//    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.   

書式指定項目には、この構文があります。


{
index[,alignment][ :formatString] }

角かっこは省略可能な要素を示します。 開始タグと右中かっこが必要です。 (をリテラルの開くを含めたり、「エスケープ中かっこ」セクションを参照して、書式指定文字列に中かっこを閉じる、複合書式指定資料です)。

たとえば、通貨値可能性があります形式に書式指定項目は、次のように表示されます。

String.Format("{0,-10:C}", 126347.89m);         

書式指定項目には、次の要素があります。

インデックス

文字列表現を引数の 0 から始まるインデックス、文字列内のこの位置に含まれています。 この引数は場合null文字列のこの位置での空の文字列が含まれます。

配置

省略可能です。 引数が挿入されるとは、右揃え (正の整数) または左揃え (負の整数値) かどうかに、フィールドの長さの合計を示す符号付き整数。 省略した場合配置、先頭または末尾のスペースなしであるフィールドに対応する引数の文字列表現を挿入します。

場合の値配置が挿入される引数の長さよりも小さい配置は無視されます、引数の文字列表現の長さは、フィールド幅として使用されます。

formatString

省略可能です。 対応する引数の結果の文字列の形式を指定する文字列。 省略した場合formatString、対応する引数のパラメーターなしのToStringメソッドは、文字列形式を生成するために呼び出されます。 指定した場合formatString、書式指定項目によって参照される引数を実装する必要があります、IFormattableインターフェイスです。 書式指定文字列をサポートする型は次のとおりです。

ただし、カスタムの型を実装することをIFormattable、既存の型の拡張またはIFormattable実装します。

次の例では、alignmentformatString書式付き出力を生成する引数。

using System;

public class Example
{
   public static void Main()
   {
      // Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
      Tuple<string, DateTime, int, DateTime, int>[] cities = 
          { Tuple.Create("Los Angeles", new DateTime(1940, 1, 1), 1504277, 
                         new DateTime(1950, 1, 1), 1970358),
            Tuple.Create("New York", new DateTime(1940, 1, 1), 7454995, 
                         new DateTime(1950, 1, 1), 7891957),  
            Tuple.Create("Chicago", new DateTime(1940, 1, 1), 3396808, 
                         new DateTime(1950, 1, 1), 3620962),  
            Tuple.Create("Detroit", new DateTime(1940, 1, 1), 1623452, 
                         new DateTime(1950, 1, 1), 1849568) };

      // Display header
      string header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
                                    "City", "Year", "Population", "Change (%)");
      Console.WriteLine(header);
      string output;      
      foreach (var city in cities) {
         output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                                city.Item1, city.Item2, city.Item3, city.Item4, city.Item5,
                                (city.Item5 - city.Item3)/ (double)city.Item3);
         Console.WriteLine(output);
      }
   }
}
// The example displays the following output:
//    City            Year  Population    Year  Population    Change (%)
//    
//    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 %
//    New York        1940   7,454,995    1950   7,891,957         5.9 %
//    Chicago         1940   3,396,808    1950   3,620,962         6.6 %
//    Detroit         1940   1,623,452    1950   1,849,568        13.9 %

書式項目は、文字列の先頭から順に処理されます。 各書式項目には、メソッドの引数リスト内のオブジェクトに対応するインデックスがあります。 Formatメソッドは、引数を取得し、その文字列形式を次のように派生します。

  • 引数が null の場合、このメソッドは結果の文字列に String.Empty を挿入します。

  • 呼び出す場合は、Format(IFormatProvider, String, Object[])オーバー ロードおよびproviderパラメーターを実装する、ICustomFormatterインターフェイスに渡される引数、providerオブジェクトのICustomFormatter.Format(String, Object, IFormatProvider)メソッドです。 書式指定項目が含まれている場合、 formatString 、引数として渡される最初の引数メソッドにします。 場合、ICustomFormatter実装は、書式指定サービスを提供することが、引数の文字列表現を返しますそれ以外の場合を返しますそれ以外の場合、nullし、次の手順を実行します。

  • 引数を実装する場合、IFormattableインターフェイス、そのIFormattable.ToString実装が呼び出されます。

  • 引数のパラメーターなしのToStringがオーバーライドまたはから継承するメソッド、Objectクラスが呼び出されて、します。

呼び出しをインターセプトする例については、ICustomFormatter.Formatメソッド情報を表示することができます、Formatメソッドは、複合書式指定文字列内の各書式項目を書式設定メソッドを参照してください例 7: 切片プロバイダーとローマ数字フォーマッタです。

Formatメソッドがスローされます、FormatExceptionインデックス項目のインデックスが、引数リスト内の引数の数以上の場合は例外です。 ただし、format同じインデックスを複数の書式項目がある限り、引数がある数より多くの書式項目を含めることができます。 呼び出しで、Format(String, Object)次の例では、引数リスト内のメソッドが 1 つの引数が、書式指定文字列には、次の 2 つの書式項目が含まれています。 10 進値、数値のいずれかが表示されます、16 進値、もう 1 つ表示します。

public class Example
{
   public static void Main()
   {
      short[] values= { Int16.MinValue, -27, 0, 1042, Int16.MaxValue };
      Console.WriteLine("{0,10}  {1,10}\n", "Decimal", "Hex");
      foreach (short value in values)
      {
         string formatString = String.Format("{0,10:G}: {0,10:X}", value);
         Console.WriteLine(formatString);
      }   
   }
}
// The example displays the following output:
//       Decimal         Hex
//    
//        -32768:       8000
//           -27:       FFE5
//             0:          0
//          1042:        412
//         32767:       7FFF

によって返される、現在のカルチャの規則を使用して、引数リスト内のオブジェクトをそれぞれの文字列表現に変換されます一般に、CultureInfo.CurrentCultureプロパティです。 オーバー ロードのいずれかを呼び出すことによってこの動作を制御するFormatが含まれている、providerパラメーター。 providerパラメーターは、IFormatProvider中程度の書式設定に使用されるカスタムおよびカルチャに固有の書式情報を提供する実装を処理します。

IFormatProviderインターフェイスが 1 つのメンバー、GetFormatはの書式情報を提供するオブジェクトを返すことを担当します。 .NET Framework には 3 つIFormatProviderカルチャに固有の書式を提供する実装。

  • CultureInfo そのGetFormatメソッドはカルチャ固有の仕様を返しますNumberFormatInfo数値およびカルチャに固有の書式設定オブジェクトDateTimeFormatInfo日付と時刻の値を書式設定するためのオブジェクト。

  • DateTimeFormatInfo、日付と時刻の値のカルチャに固有の書式設定に使用されます。 そのGetFormatメソッドでは、それ自体を返します。

  • NumberFormatInfo、数値のカルチャに固有の書式設定に使用されます。 そのGetFormatプロパティには、それ自体を返します。

いずれかのオーバー ロードを呼び出すことができます、Formatメソッドが指定されて、providerパラメーターFormat(IFormatProvider, String, Object[])のオーバー ロードをカスタムの書式設定操作を実行します。 たとえば、書式を設定する整数識別番号、または電話番号として。 カスタム書式設定を実行する、provider引数は、両方を実装する必要があります、IFormatProviderICustomFormatterインターフェイスです。 ときに、Formatメソッドに渡されます、ICustomFormatter実装として、provider引数、Formatメソッドの呼び出し、IFormatProvider.GetFormat実装型のオブジェクトを要求してICustomFormatterです。 呼び出して、返されたICustomFormatterオブジェクトのFormatに複合文字列の各書式項目の書式を設定するメソッドに渡されます。

詳細については、カスタムの書式設定ソリューションを提供する、次を参照してください。方法 : カスタム数値書式プロバイダーを定義して使用するICustomFormatterです。 整数を書式設定されたカスタムの数値に変換する例は、次を参照してください。例 6: カスタムの書式設定操作です。 符号なしバイトをローマ数字に変換する例は、次を参照してください。例 7: 切片プロバイダーとローマ数字フォーマッタです。

次の例では、Format(String, Object)を文字列の途中で個々 のユーザーの年齢を埋め込む方法。

using System;

[assembly: CLSCompliant(true)]
public class Example
{
   public static void Main()
   {
      DateTime birthdate = new DateTime(1993, 7, 28);
      DateTime[] dates = { new DateTime(1993, 8, 16), 
                           new DateTime(1994, 7, 28), 
                           new DateTime(2000, 10, 16), 
                           new DateTime(2003, 7, 27), 
                           new DateTime(2007, 5, 27) };

      foreach (DateTime dateValue in dates)
      {
         TimeSpan interval = dateValue - birthdate;
         // Get the approximate number of years, without accounting for leap years.
         int years = ((int) interval.TotalDays) / 365;
         // See if adding the number of years exceeds dateValue.
         string output;
         if (birthdate.AddYears(years) <= dateValue) {
            output = String.Format("You are now {0} years old.", years);
            Console.WriteLine(output);
         }   
         else {
            output = String.Format("You are now {0} years old.", years - 1);
            Console.WriteLine(output);
         }      
      }
   }
}
// The example displays the following output:
//       You are now 0 years old.
//       You are now 1 years old.
//       You are now 7 years old.
//       You are now 9 years old.
//       You are now 13 years old.

この例では、Format(String, Object, Object)ジェネリック型に格納されている時刻と温度のデータを表示するメソッドをDictionary<TKey, TValue>オブジェクト。 書式設定する 2 つのオブジェクトが、書式指定文字列が次の 3 つの書式指定項目に注意してください。 これは、(日付と時刻の値) の一覧の最初のオブジェクトが 2 つの書式指定項目によって使用されるため、: 最初書式項目が表示されます、時刻、および 2 番目の日付を表示します。

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      Dictionary<DateTime, Double> temperatureInfo = new Dictionary<DateTime, Double>(); 
      temperatureInfo.Add(new DateTime(2010, 6, 1, 14, 0, 0), 87.46);
      temperatureInfo.Add(new DateTime(2010, 12, 1, 10, 0, 0), 36.81);

      Console.WriteLine("Temperature Information:\n");
      string output;   
      foreach (var item in temperatureInfo)
      {
         output = String.Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}°F", 
                                item.Key, item.Value);
         Console.WriteLine(output);
      }
   }
}
// The example displays the following output:
//       Temperature Information:
//       
//       Temperature at  2:00 PM on  6/1/2010:  87.5°F
//       Temperature at 10:00 AM on 12/1/2010:  36.8°F

この例では、Format(String, Object, Object, Object)ブール値の結果を示す文字列を作成するメソッドAnd2 つの整数値で操作します。 各項目が 2 つの方法で書式設定されたため、書式指定文字列には、6 つの書式項目が含まれていますが、メソッドのパラメーター リストの 3 つだけのアイテムに注意してください。

using System;

public class Example
{
   public static void Main()
   {
      string formatString = "    {0,10} ({0,8:X8})\n" + 
                            "And {1,10} ({1,8:X8})\n" + 
                            "  = {2,10} ({2,8:X8})";
      int value1 = 16932;
      int value2 = 15421;
      string result = String.Format(formatString, 
                                    value1, value2, value1 & value2);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//                16932 (00004224)
//       And      15421 (00003C3D)
//         =         36 (00000024)

この例では、特定の日付の上限と下限の温度上のデータを含む文字列を作成します。 複合書式指定文字列は、c# の例では 5 つの書式指定項目と Visual Basic の例は 6 つがします。 形式の対応する値の文字列形式の幅を定義する 2 つの書式項目をおよび最初の書式項目は、標準の日時書式指定文字列にも含まれます。

using System;

public class Example
{
   public static void Main()
   {
      DateTime date1 = new DateTime(2009, 7, 1);
      TimeSpan hiTime = new TimeSpan(14, 17, 32);
      decimal hiTemp = 62.1m; 
      TimeSpan loTime = new TimeSpan(3, 16, 10);
      decimal loTemp = 54.8m; 

      string result1 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                     date1, hiTime, hiTemp, loTime, loTemp);
      Console.WriteLine(result1);
      Console.WriteLine();

      string result2 = String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", 
                                     new object[] { date1, hiTime, hiTemp, loTime, loTemp });
      Console.WriteLine(result2);
   }
}
// The example displays the following output:
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)
//       Temperature on 7/1/2009:
//          14:17:32: 62.1 degrees (hi)
//          03:16:10: 54.8 degrees (lo)

配列として書式設定するオブジェクトを渡すこともできますではなく、引数リストを指定します。

using System;

public class CityInfo
{
   public CityInfo(String name, int population, Decimal area, int year)
   {
      this.Name = name;
      this.Population = population;
      this.Area = area;
      this.Year = year;
   }

   public readonly String Name; 
   public readonly int Population;
   public readonly Decimal Area;
   public readonly int Year;
}

public class Example
{
   public static void Main()
   {
      CityInfo nyc2010 = new CityInfo("New York", 8175133, 302.64m, 2010);
      ShowPopulationData(nyc2010);
      CityInfo sea2010 = new CityInfo("Seattle", 608660, 83.94m, 2010);      
      ShowPopulationData(sea2010); 
   }

   private static void ShowPopulationData(CityInfo city)
   {
      object[] args = { city.Name, city.Year, city.Population, city.Area };
      String result = String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", 
                                    args);
      Console.WriteLine(result); 
   }
}
// The example displays the following output:
//       New York in 2010: Population 8,175,133, Area 302.6 sq. feet
//       Seattle in 2010: Population 608,660, Area 83.9 sq. feet

この例では、Format(IFormatProvider, String, Object[])メソッドを複数の異なるカルチャを使用して、一部の日付と時刻の値と数値の文字列形式を表示します。

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] cultureNames = { "en-US", "fr-FR", "de-DE", "es-ES" };

      DateTime dateToDisplay = new DateTime(2009, 9, 1, 18, 32, 0);
      double value = 9164.32;

      Console.WriteLine("Culture     Date                                Value\n");
      foreach (string cultureName in cultureNames)
      {
         CultureInfo culture = new CultureInfo(cultureName);
         string output = String.Format(culture, "{0,-11} {1,-35:D} {2:N}", 
                                       culture.Name, dateToDisplay, value);
         Console.WriteLine(output);
      }    
   }
}
// The example displays the following output:
//    Culture     Date                                Value
//    
//    en-US       Tuesday, September 01, 2009         9,164.32
//    fr-FR       mardi 1 septembre 2009              9 164,32
//    de-DE       Dienstag, 1. September 2009         9.164,32
//    es-ES       martes, 01 de septiembre de 2009    9.164,32

この例では、フォーム x-xxxxx-xx で顧客アカウント番号として整数値を書式設定する書式設定プロバイダーを定義します。

using System;

public class TestFormatter
{
   public static void Main()
   {
      int acctNumber = 79203159;
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:G}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:S}", acctNumber));
      Console.WriteLine(String.Format(new CustomerFormatter(), "{0:P}", acctNumber));
      try {
         Console.WriteLine(String.Format(new CustomerFormatter(), "{0:X}", acctNumber));
      }
      catch (FormatException e) {
         Console.WriteLine(e.Message);
      }
   }
}

public class CustomerFormatter : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType) 
   {
      if (formatType == typeof(ICustomFormatter))        
         return this; 
      else
         return null;
   }

   public string Format(string format, 
	                     object arg, 
	                     IFormatProvider formatProvider) 
   {                       
      if (! this.Equals(formatProvider))
      {
         return null;
      }
      else
      {
         if (String.IsNullOrEmpty(format)) 
            format = "G";

         string customerString = arg.ToString();
         if (customerString.Length < 8)
            customerString = customerString.PadLeft(8, '0');

         format = format.ToUpper();
         switch (format)
         {
            case "G":
               return customerString.Substring(0, 1) + "-" +
                                     customerString.Substring(1, 5) + "-" +
                                     customerString.Substring(6);
            case "S":                          
               return customerString.Substring(0, 1) + "/" +
                                     customerString.Substring(1, 5) + "/" +
                                     customerString.Substring(6);
            case "P":                          
               return customerString.Substring(0, 1) + "." +
                                     customerString.Substring(1, 5) + "." +
                                     customerString.Substring(6);
            default:
               throw new FormatException( 
                         String.Format("The '{0}' format specifier is not supported.", format));
         }
      }   
   }
}
// The example displays the following output:
//       7-92031-59
//       7-92031-59
//       7/92031/59
//       7.92031.59
//       The 'X' format specifier is not supported.

この例で定義を実装するカスタム書式設定プロバイダー、ICustomFormatterIFormatProviderインターフェイスを 2 つの処理を行うには。

  • 渡されるパラメーターが表示されます、ICustomFormatter.Format実装します。 これにより、どのようなパラメーターを表示する、Format(IFormatProvider, String, Object[])書式を設定しようとする各オブジェクトのカスタム書式設定を実装するメソッドを渡します。 これは、アプリケーションをデバッグするときに役立ちます。

  • 書式設定するオブジェクトが"R"標準書式指定文字列を使用して書式設定対象である符号なしバイト値の場合は、カスタム フォーマッタ ローマ数字として、数値の書式設定します。

using System;
using System.Globalization;

public class InterceptProvider : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(ICustomFormatter))
         return this;
      else
         return null;
   }

   public string Format(String format, Object obj, IFormatProvider provider) 
   {
      // Display information about method call.
      string formatString = format ?? "<null>";
      Console.WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider, obj ?? "<null>", formatString);

      if (obj == null) return String.Empty;

      // If this is a byte and the "R" format string, format it with Roman numerals.
      if (obj is Byte && formatString.ToUpper().Equals("R")) {
         Byte value = (Byte) obj;
         int remainder;
         int result;
         String returnString = String.Empty;

         // Get the hundreds digit(s)
         result = Math.DivRem(value, 100, out remainder);
         if (result > 0)  
            returnString = new String('C', result);
         value = (Byte) remainder;
         // Get the 50s digit
         result = Math.DivRem(value, 50, out remainder);
         if (result == 1)
            returnString += "L";
         value = (Byte) remainder;
         // Get the tens digit.
         result = Math.DivRem(value, 10, out remainder);
         if (result > 0)
            returnString += new String('X', result);
         value = (Byte) remainder; 
         // Get the fives digit.
         result = Math.DivRem(value, 5, out remainder);
         if (result > 0)
            returnString += "V";
         value = (Byte) remainder;
         // Add the ones digit.
         if (remainder > 0) 
            returnString += new String('I', remainder);

         // Check whether we have too many X characters.
         int pos = returnString.IndexOf("XXXX");
         if (pos >= 0) {
            int xPos = returnString.IndexOf("L"); 
            if (xPos >= 0 & xPos == pos - 1)
               returnString = returnString.Replace("LXXXX", "XC");
            else
               returnString = returnString.Replace("XXXX", "XL");   
         }
         // Check whether we have too many I characters
         pos = returnString.IndexOf("IIII");
         if (pos >= 0)
            if (returnString.IndexOf("V") >= 0)
               returnString = returnString.Replace("VIIII", "IX");
            else
               returnString = returnString.Replace("IIII", "IV");    

         return returnString; 
      }   

      // Use default for all other formatting.
      if (obj is IFormattable)
         return ((IFormattable) obj).ToString(format, CultureInfo.CurrentCulture);
      else
         return obj.ToString();
   }
}

public class Example
{
   public static void Main()
   {
      int n = 10;
      double value = 16.935;
      DateTime day = DateTime.Now;
      InterceptProvider provider = new InterceptProvider();
      Console.WriteLine(String.Format(provider, "{0:N0}: {1:C2} on {2:d}\n", n, value, day));
      Console.WriteLine(String.Format(provider, "{0}: {1:F}\n", "Today: ", 
                                      (DayOfWeek) DateTime.Now.DayOfWeek));
      Console.WriteLine(String.Format(provider, "{0:X}, {1}, {2}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
      Console.WriteLine(String.Format(provider, "{0:R}, {1:R}, {2:R}\n", 
                                      (Byte) 2, (Byte) 12, (Byte) 199));
   }
}
// The example displays the following output:
//    Provider: InterceptProvider, Object: 10, Format String: N0
//    Provider: InterceptProvider, Object: 16.935, Format String: C2
//    Provider: InterceptProvider, Object: 1/31/2013 6:10:28 PM, Format String: d
//    10: $16.94 on 1/31/2013
//    
//    Provider: InterceptProvider, Object: Today: , Format String: <null>
//    Provider: InterceptProvider, Object: Thursday, Format String: F
//    Today: : Thursday
//    
//    Provider: InterceptProvider, Object: 2, Format String: X
//    Provider: InterceptProvider, Object: 12, Format String: <null>
//    Provider: InterceptProvider, Object: 199, Format String: <null>
//    2, 12, 199
//    
//    Provider: InterceptProvider, Object: 2, Format String: R
//    Provider: InterceptProvider, Object: 12, Format String: R
//    Provider: InterceptProvider, Object: 199, Format String: R
//    II, XII, CXCIX

.NET Framework

すべてのオーバー ロードではサポートされて: 4.5、4、3.5、3.0、2.0、1.1、1.0

.NET Framework Client Profile

すべてのオーバー ロードではサポートされて: 4、3.5 SP1

汎用性のあるクラス ライブラリ

のみFormat(String, Object[])Format(IFormatProvider, String, Object[])はサポートされています。

Windows ストア アプリ用 .NET

のみFormat(String, Object[])Format(IFormatProvider, String, Object[])Windows 8 でサポートされます

書式指定項目の一般的な構文です。

{index[,alignment][: formatString]}

ここで配置フィールドの幅を定義する符号付き整数します。 この値が負の場合は、フィールド内のテキストを左揃えです。 正の場合は、テキストが右揃えです。

すべて標準数値書式指定文字列(整数のみで使用される) を"D"、"G"、"R"を除くし、"X"は、結果の文字列の小数点以下桁数を定義する有効桁数指定子を許可します。 次の例では、標準の数値書式指定文字列を使用して、結果の文字列の 10 進数字の数を制御します。

using System;

public class Example
{
   public static void Main()
   {
      object[] values = { 1603, 1794.68235, 15436.14 };
      string result;
      foreach (var value in values) {
         result = String.Format("{0,12:C2}   {0,12:E3}   {0,12:F4}   {0,12:N3}  {1,12:P2}\n",
                                Convert.ToDouble(value), Convert.ToDouble(value) / 10000);
         Console.WriteLine(result);
      }                           
   }
}
// The example displays the following output:
//       $1,603.00     1.603E+003      1603.0000      1,603.000       16.03 %
//    
//       $1,794.68     1.795E+003      1794.6824      1,794.682       17.95 %
//    
//      $15,436.14     1.544E+004     15436.1400     15,436.140      154.36 %

使用する場合、カスタム数値書式指定文字列結果の文字列に次の例のようにの 10 進数字の数を制御する、「0」書式指定子を使用します。

using System;

public class Example
{
   public static void Main()
   {
      decimal value = 16309.5436m;
      string result = String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}", 
                                    value);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//        16309.54360    16,309.54    16309.544

既定では、書式設定操作は、整数の桁を 0 以外をのみ表示されます。 整数の書式を設定する場合は、数字の数を制御する、精度指定子"D"と"X"標準書式指定文字列を使用できます。

using System;

public class Example
{
   public static void Main()
   {
      int value = 1326;
      string result = String.Format("{0,10:D6} {0,10:X8}", value);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//     001326   0000052E

「0」を使用して、指定された数の整数部の桁の結果の文字列を生成するために整数または浮動小数点数に先行ゼロを埋め込むカスタム数値書式指定子次の例を示します。

using System;

public class Example
{
   public static void Main()
   {
      int value = 16342;
      string result = String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}", 
                                    value);
      Console.WriteLine(result);
   }
}
// The example displays the following output:
//           00016342       00016342.000    0,000,016,342.0

実際の制限はありません。 2 番目のパラメーター、Format(IFormatProvider, String, Object[])メソッドは割り当てられ、ParamArrayAttribute属性は、コンマ区切りのリストまたは、[形式] ボックスの一覧としてオブジェクトの配列のいずれかを含めることができます。

たとえば、どのようにするには次のメソッド呼び出しからスロー、FormatException例外しますか?

result = String.Format("The text has {0} '{' characters and {1} '}' characters.",
                       nOpen, nClose);

1 つの始めまたは終わりかっこは、常に先頭または書式項目の末尾として解釈がします。 どおりに解釈するのにそれをエスケープする必要があります。 別の中かっこを追加することによって、かっこをエスケープする ("{{"と"}}"の代わりに"{"と"}")、次のメソッド呼び出しのように。

result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
                       nOpen, nClose);

ただし、さらにエスケープされた中かっこは簡単に誤ったです。 形式の一覧で中かっこを含めるし、次の例のように、結果の文字列に挿入の書式項目を使用することをお勧めします。

result = String.Format("The text has {0} '{1}' characters and {2} '{3}' characters.",
                       nOpen, "{", nClose, "}");

例外の最も一般的な原因は、書式指定項目のインデックスが形式 リスト内のオブジェクトに対応していないことです。 通常このエラーは、書式指定項目のインデックスを misnumbered したか、オブジェクトの一覧に含める、形式を忘れてしまったことを示します。 場合によっては、例外は、入力ミス; の結果入力し間違えたによくある間違いは、たとえば、"["(左角かっこ) の代わりに"{"(左中かっこ)。

たとえば、次のコードがスローされます、FormatException例外。

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      int[]  numbers = new int[4];
      int total = 0;
      for (int ctr = 0; ctr <= 2; ctr++) {
         int number = rnd.Next(1001);
         numbers[ctr] = number;
         total += number;
      }   
      numbers[3] = total;
      Console.WriteLine("{0} + {1} + {2} = {3}", numbers);   
   }
}

これは、コンパイラのオーバー ロードの解決の問題です。 コンパイラでは、整数の配列をオブジェクト配列に変換することはできません、ため、整数の配列として扱われます、単一の引数を呼び出すので、Format(String, Object)メソッドです。 次の 4 つの書式項目が形式の一覧で 1 つの項目のみがあるために、例外がスローされます。

呼び出しの前に自分で変換を実行する必要があるため、Visual Basic でも C# の場合は、整数の配列をオブジェクト配列に変換できます、Format(String, Object[])メソッドです。 次の例では、1 つの実装を提供します。

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      Random rnd = new Random();
      int[]  numbers = new int[4];
      int total = 0;
      for (int ctr = 0; ctr <= 2; ctr++) {
         int number = rnd.Next(1001);
         numbers[ctr] = number;
         total += number;
      }   
      numbers[3] = total;
      object[] values = new object[numbers.Length];
      numbers.CopyTo(values, 0);
      Console.WriteLine("{0} + {1} + {2} = {3}", values);   
   }
}
トップに戻る
表示: