String.Format メソッド

定義

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

String.Formatメソッドを初めて使用する場合は、「String.Format メソッドの概要」を参照してください。

オーバーロード

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

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

Format(IFormatProvider, String, Object, Object)

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

Format(String, Object, Object)

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

Format(IFormatProvider, CompositeFormat, ReadOnlySpan<Object>)

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

Format(IFormatProvider, CompositeFormat, Object[])

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

Format(String, Object, Object, Object)

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

Format(IFormatProvider, String, Object[])

文字列内の書式指定項目を、指定した配列内の対応するオブジェクトの文字列形式に置き換えます。 パラメーターは、カルチャ固有の書式設定情報を提供します。

Format(IFormatProvider, String, Object)

指定した文字列内の書式指定項目を、対応するオブジェクトの文字列形式に置き換えます。 パラメーターは、カルチャ固有の書式設定情報を提供します。

Format(String, ReadOnlySpan<Object>)

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

Format(String, Object[])

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

Format(String, Object)

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

Format(IFormatProvider, String, ReadOnlySpan<Object>)

文字列内の書式指定項目を、指定されたスパン内の対応するオブジェクトの文字列形式に置き換えます。 パラメーターは、カルチャ固有の書式設定情報を提供します。

Format<TArg0,TArg1,TArg2>(IFormatProvider, CompositeFormat, TArg0, TArg1, TArg2)

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

Format<TArg0,TArg1>(IFormatProvider, CompositeFormat, TArg0, TArg1)

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

Format<TArg0>(IFormatProvider, CompositeFormat, TArg0)

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

Format メソッドを呼び出す多くの例は、この記事全体に散在しています。 String.Formatを含む、の例の完全なセットをダウンロードすることもできます。

この記事に含まれる例の一部を次に示します。

フォーマット文字列を作成する

文字列を挿入する
書式項目
同じインデックスを持つアイテムの書式設定

書式設定された出力を制御する

コントロールの書式設定
コントロールの間隔
配置を制御する
整数の桁数を制御する
小数点区切り記号の後の桁数を制御する
結果文字列にリテラルの中かっこを含める

書式指定文字列を文化に合わせて調整する

書式指定文字列を文化に依存させる

書式設定操作をカスタマイズする

カスタム書式設定操作
傍受プロバイダーとローマ数字フォーマッタ

String.Format メソッドを始める

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

Decimal pricePerOunce = 17.36m;
String s = String.Format("The current price is {0} per ounce.",
                         pricePerOunce);
Console.WriteLine(s);
// Result: The current price is 17.36 per ounce.
let pricePerOunce = 17.36m
String.Format("The current price is {0} per ounce.", pricePerOunce)
|> printfn "%s"
// Result: The current price is 17.36 per ounce.
Dim pricePerOunce As Decimal = 17.36D
Dim s As String = 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);
Console.WriteLine(s);
// Result if current culture is en-US:
//      The current price is $17.36 per ounce.
let pricePerOunce = 17.36m
String.Format("The current price is {0:C2} per ounce.", pricePerOunce)
|> printfn "%s"
// Result if current culture is en-US:
//      The current price is $17.36 per ounce.
Dim pricePerOunce As Decimal = 17.36D
Dim s As String = 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.'
let temp = 20.4m
String.Format("The temperature is {0}°C.", temp)
|> printfn "%s"
// Displays 'The temperature is 20.4°C.'
Dim temp As Decimal = 20.4D
Dim s As String = String.Format("The temperature is {0}°C.", temp)
Console.WriteLine(s)
' Displays 'The temperature is 20.4°C.'

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

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

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

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

コントロールの書式設定

書式指定文字列を含む書式指定項目のインデックスに従って、オブジェクトの書式設定方法を制御できます。 たとえば、 {0:d} は、オブジェクト リストの最初のオブジェクトに "d" 書式指定文字列を適用します。 1 つのオブジェクトと 2 つの書式項目の例を次に示します。

string s = String.Format("It is now {0:d} at {0:t}", DateTime.Now);
Console.WriteLine(s);
// Output similar to: 'It is now 4/10/2015 at 10:04 AM'
String.Format("It is now {0:d} at {0:t}", DateTime.Now)
|> printfn "%s"
// Output similar to: 'It is now 4/10/2015 at 10:04 AM'
Dim s As String = String.Format("It is now {0:d} at {0:t}",
                              Date.Now)
' Output similar to: 'It is now 4/10/2015 at 10:04 AM'

多くの型では、すべての数値型 ( 標準 書式指定文字列と カスタム 書式指定文字列の両方)、すべての日付と時刻 ( 標準 書式指定文字列と カスタム 書式指定文字列の両方)、時間間隔 ( 標準 書式指定文字列と カスタム 書式指定文字列の両方)、すべての列挙型 列挙型、GUID など、書式指定文字列がサポート されています。 書式指定文字列のサポートを独自の型に追加することもできます。

間隔を制御する

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

次の例では、文字列 "Year" といくつかの年の文字列を保持する 6 文字のフィールドと、文字列 "Population" と一部の母集団データを保持する 15 文字のフィールドを定義します。 フィールド内で文字が右揃えになっていることに注意してください。

int[] years = { 2013, 2014, 2015 };
int[] population = { 1025632, 1105967, 1148203 };
var sb = new System.Text.StringBuilder();
sb.Append(String.Format("{0,6} {1,15}\n\n", "Year", "Population"));
for (int index = 0; index < years.Length; index++)
    sb.Append(String.Format("{0,6} {1,15:N0}\n", years[index], population[index]));

Console.WriteLine(sb);

// Result:
//      Year      Population
//
//      2013       1,025,632
//      2014       1,105,967
//      2015       1,148,203
open System
open System.Text
 
let years = [| 2013; 2014; 2015 |]
let population = [| 1025632; 1105967; 1148203 |]
let sb = StringBuilder()
sb.Append(String.Format("{0,6} {1,15}\n\n", "Year", "Population")) |> ignore
for i = 0 to years.Length - 1 do
   sb.Append(String.Format("{0,6} {1,15:N0}\n", years[i], population[i])) |> ignore

printfn $"{sb}"

// Result:
//      Year      Population
//
//      2013       1,025,632
//      2014       1,105,967
//      2015       1,148,203
Dim years() As Integer = {2013, 2014, 2015}
Dim population() As Integer = {1025632, 1105967, 1148203}
Dim sb As New StringBuilder()
sb.Append(String.Format("{0,6} {1,15}{2}{2}",
                       "Year", "Population", vbCrLf))
For index As Integer = 0 To years.Length - 1
    sb.AppendFormat("{0,6} {1,15:N0}{2}",
                  years(index), population(index), vbCrLf)
Next
' Result:
'      Year      Population
'
'      2013       1,025,632
'      2014       1,105,967
'      2015       1,148,203

配置を制御する

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

次の例は前の例と似ていますが、ラベルとデータの両方が左揃えになっている点が異なります。

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]);
Console.WriteLine($"\n{s}");
// Result:
//    Year       Population
//
//    2013       1,025,632
//    2014       1,105,967
//    2015       1,148,203
let years = [| 2013; 2014; 2015 |]
let population = [| 1025632; 1105967; 1148203 |]
let mutable s = String.Format("{0,-10} {1,-10}\n\n", "Year", "Population")
for i = 0 to years.Length - 1 do
    s <- s + String.Format("{0,-10} {1,-10:N0}\n", years[i], population[i])
printfn $"\n{s}"
// Result:
//    Year       Population
//
//    2013       1,025,632
//    2014       1,105,967
//    2015       1,148,203
Dim years() As Integer = {2013, 2014, 2015}
Dim population() As Integer = {1025632, 1105967, 1148203}
Dim s As String = String.Format("{0,-10} {1,-10}{2}{2}",
                               "Year", "Population", vbCrLf)
For index As Integer = 0 To years.Length - 1
    s += String.Format("{0,-10} {1,-10:N0}{2}",
                     years(index), population(index), vbCrLf)
Next
' Result:
'    Year       Population
'
'    2013       1,025,632
'    2014       1,105,967
'    2015       1,148,203

String.Format では、複合書式設定機能が使用されます。 詳しい情報は、次を参照してください Composite Formatting

どのメソッドを呼び出しますか?

Objective 呼び出すメソッド
現在のカルチャの規則を使用して、1 つ以上のオブジェクトを書式設定します。 provider パラメーターを含むオーバーロードを除き、残りのFormatオーバーロードには、String パラメーターと 1 つ以上のオブジェクト パラメーターが含まれます。 このため、どの FormatFormat オーバーロードを呼び出すかを決定する必要はありません。 言語コンパイラは、引数リストに基づいて、 provider パラメーターを持たないオーバーロードの中から適切なオーバーロードを選択します。 たとえば、引数リストに 5 つの引数がある場合、コンパイラは Format(String, Object[]) メソッドを呼び出します。
特定のカルチャの規則を使用して、1 つ以上のオブジェクトを書式設定します。 Format パラメーターで始まる各providerオーバーロードには、String パラメーターと 1 つ以上のオブジェクト パラメーターが続きます。 このため、呼び出す特定の Format オーバーロードを決定する必要はありません。 言語コンパイラは、引数リストに基づいて、 provider パラメーターを持つオーバーロードの中から適切なオーバーロードを選択します。 たとえば、引数リストに 5 つの引数がある場合、コンパイラは Format(IFormatProvider, String, Object[]) メソッドを呼び出します。
ICustomFormatter実装またはIFormattable実装を使用して、カスタム書式設定操作を実行します。 provider パラメーターを持つ 4 つのオーバーロードのいずれか。 コンパイラは、引数リストに基づいて、 provider パラメーターを持つオーバーロードの中から適切なオーバーロードを選択します。

Format メソッドの概要

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 output like the following:
//    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.
open System

let dat = DateTime(2012, 1, 17, 9, 30, 0) 
let city = "Chicago"
let temp = -16
String.Format("At {0} in {1}, the temperature was {2} degrees.", dat, city, temp)
|> printfn "%s"
// The example displays output like the following:
//    At 1/17/2012 9:30:00 AM in Chicago, the temperature was -16 degrees.
Dim dat As Date = #1/17/2012 9:30AM#
Dim city As String = "Chicago"
Dim temp As Integer = -16
Dim output As String = 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[,width][:formatString]}

角かっこは省略可能な要素を示します。 左中かっこと右中かっこが必要です。 (書式文字列にリテラルの左中かっこまたは右中かっこを含めるには、「複合書式設定」で中かっこのエスケープに関するセクションを参照してください。)

たとえば、通貨値を書式設定する書式項目は、次のように表示されます。

var value = String.Format("{0,-10:C}", 126347.89m);
Console.WriteLine(value);
open System

String.Format("{0,-10:C}", 126347.89m)         
|> printfn "%s"
String.Format("{0,-10:C}", 126347.89D)

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

index
引数の文字列表現が文字列内のこの位置に含まれるための 0 ベースのインデックス。 この引数が nullの場合、空の文字列が文字列のこの位置に含まれます。

width
Optional. 引数が挿入されるフィールドの合計長と、引数が右揃え (正の整数) か左揃え (負の整数) かを示す符号付き整数。 widthを省略すると、対応する引数の文字列形式が、先頭または末尾のスペースのないフィールドに挿入されます。

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

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

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

次の例では、 width 引数と formatString 引数を使用して、書式設定された出力を生成します。

// 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
var header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
                              "City", "Year", "Population", "Change (%)");
Console.WriteLine(header);
foreach (var city in cities) {
   var 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 %
// Create a list of 5-tuples with population data for three U.S. cities, 1940-1950.
let cities = 
    [ "Los Angeles", DateTime(1940, 1, 1), 1504277, DateTime(1950, 1, 1), 1970358
      "New York", DateTime(1940, 1, 1), 7454995, DateTime(1950, 1, 1), 7891957
      "Chicago", DateTime(1940, 1, 1), 3396808, DateTime(1950, 1, 1), 3620962
      "Detroit", DateTime(1940, 1, 1), 1623452, DateTime(1950, 1, 1), 1849568 ]

// Display header
String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n", "City", "Year", "Population", "Change (%)")
|> printfn "%s"

for name, year1, pop1, year2, pop2 in cities do
    String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                  name, year1, pop1, year2, pop2,
                  double (pop2 - pop1) / double pop1)
    |> printfn "%s"
// 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 %
Module Example4
    Public Sub Main()
        ' Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
        Dim cities() =
          {Tuple.Create("Los Angeles", #1/1/1940#, 1504277, #1/1/1950#, 1970358),
            Tuple.Create("New York", #1/1/1940#, 7454995, #1/1/1950#, 7891957),
            Tuple.Create("Chicago", #1/1/1940#, 3396808, #1/1/1950#, 3620962),
            Tuple.Create("Detroit", #1/1/1940#, 1623452, #1/1/1950#, 1849568)}

        ' Display header
        Dim header As String = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}",
                                           "City", "Year", "Population", "Change (%)")
        Console.WriteLine(header)
        Console.WriteLine()
        For Each city In cities
            Dim 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) / city.Item3)
            Console.WriteLine(output)
        Next
    End Sub
End Module
' 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 を挿入します。 null 引数の NullReferenceException を処理する必要はありません。

  • Format(IFormatProvider, String, Object[])オーバーロードを呼び出し、provider オブジェクトのIFormatProvider.GetFormat実装が null 以外のICustomFormatter実装を返す場合、引数はそのICustomFormatter.Format(String, Object, IFormatProvider) メソッドに渡されます。 書式指定項目に formatString 引数が含まれている場合は、メソッドの最初の引数として渡されます。 ICustomFormatter実装が使用可能で、null 以外の文字列が生成された場合、その文字列は引数の文字列表現として返されます。それ以外の場合は、次の手順が実行されます。

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

  • 基底クラスの実装をオーバーライドまたは継承する、引数のパラメーターなしの ToString メソッドが呼び出されます。

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

詳細については、 処理順序を参照してください。

同じインデックスを持つアイテムの書式設定

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

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
open System

let values= [| Int16.MinValue; -27s; 0s; 1042s; Int16.MaxValue |]
printfn "%10s  %10s\n" "Decimal" "Hex"
for value in values do
    String.Format("{0,10:G}: {0,10:X}", value)
    |> printfn "%s"
// The example displays the following output:
//       Decimal         Hex
//    
//        -32768:       8000
//           -27:       FFE5
//             0:          0
//          1042:        412
//         32767:       7FFF
Module Example1
    Public Sub Main()
        Dim values() As Short = {Int16.MinValue, -27, 0, 1042, Int16.MaxValue}
        Console.WriteLine("{0,10}  {1,10}", "Decimal", "Hex")
        Console.WriteLine()
        For Each value As Short In values
            Dim formatString As String = String.Format("{0,10:G}: {0,10:X}", value)
            Console.WriteLine(formatString)
        Next
    End Sub
End Module
' 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 には、カルチャ固有の書式設定を提供する 3 つの IFormatProvider 実装があります。

  • CultureInfo。 その GetFormat メソッドは、数値を書式設定するためのカルチャ固有の NumberFormatInfo オブジェクトと、日付と時刻の値を書式設定するためのカルチャ固有の DateTimeFormatInfo オブジェクトを返します。
  • DateTimeFormatInfoは、日付と時刻の値のカルチャ固有の書式設定に使用されます。 その GetFormat メソッドはそれ自体を返します。
  • NumberFormatInfoは、数値のカルチャ固有の書式設定に使用されます。 その GetFormat(Type) メソッドはそれ自体を返します。

カスタム書式設定操作

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

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

例: カスタム書式設定操作

この例では、整数値を 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.
open System

type CustomerFormatter() = 
    interface IFormatProvider with
        member this.GetFormat(formatType) =
            if formatType = typeof<ICustomFormatter> then
                this
            else
                null

    interface ICustomFormatter with
        member this.Format(format, arg, formatProvider: IFormatProvider) = 
            if this.Equals formatProvider |> not then
                null
            else
                let format = 
                    if String.IsNullOrEmpty format then "G"
                    else format.ToUpper()
                
                let customerString = 
                    let s = string arg
                    if s.Length < 8 then
                        s.PadLeft(8, '0')
                    else s
                
                match format with
                | "G" ->
                    customerString.Substring(0, 1) + "-" +
                        customerString.Substring(1, 5) + "-" +
                        customerString.Substring 6
                | "S" ->                          
                    customerString.Substring(0, 1) + "/" +
                        customerString.Substring(1, 5) + "/" +
                        customerString.Substring 6
                | "P" ->                          
                    customerString.Substring(0, 1) + "." +
                        customerString.Substring(1, 5) + "." +
                        customerString.Substring 6
                | _ ->
                    raise (FormatException $"The '{format}' format specifier is not supported.")

let acctNumber = 79203159
String.Format(CustomerFormatter(), "{0}", acctNumber)
|> printfn "%s"
String.Format(CustomerFormatter(), "{0:G}", acctNumber)
|> printfn "%s"
String.Format(CustomerFormatter(), "{0:S}", acctNumber)
|> printfn "%s"
String.Format(CustomerFormatter(), "{0:P}", acctNumber)
|> printfn "%s"
try
    String.Format(CustomerFormatter(), "{0:X}", acctNumber)
    |> printfn "%s"
with :? FormatException as e ->
    printfn $"{e.Message}"

// 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.
Module TestFormatter
   Public Sub Main()
      Dim acctNumber As Integer = 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 e As FormatException
         Console.WriteLine(e.Message)
      End Try   
   End Sub
End Module

Public Class CustomerFormatter : Implements IFormatProvider, ICustomFormatter
   Public Function GetFormat(type As Type) As Object  _
                   Implements IFormatProvider.GetFormat
      If type Is GetType(ICustomFormatter) Then
         Return Me
      Else
         Return Nothing
      End If
   End Function
   
   Public Function Format(fmt As String, _
                           arg As Object, _
                           formatProvider As IFormatProvider) As String _
                    Implements ICustomFormatter.Format
      If Not Me.Equals(formatProvider) Then
         Return Nothing
      Else
         If String.IsNullOrEmpty(fmt) Then fmt = "G"
         
         Dim customerString As String = arg.ToString()
         if customerString.Length < 8 Then _
            customerString = customerString.PadLeft(8, "0"c)
         
         Select Case fmt
            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)
            Case Else
               Throw New FormatException( _
                         String.Format("The '{0}' format specifier is not supported.", fmt))
         End Select                                                     
      End If   
   End Function
End Class
' 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.

例: インターセプトプロバイダとローマ数字フォーマッタ

この例では、 ICustomFormatter インターフェイスと IFormatProvider インターフェイスを実装して 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.GetType().Name, 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 FormatExample12
{
   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
open System
open System.Globalization

type InterceptProvider() =
    interface IFormatProvider with
        member this.GetFormat(formatType) =
            if formatType = typeof<ICustomFormatter> then
                this
            else
                null
    interface ICustomFormatter with
        member _.Format(format, obj, provider: IFormatProvider) = 
            // Display information about method call.
            let formatString =
                if format = null then "<null>" else format
            printfn $"Provider: {provider.GetType().Name}, Object: %A{obj}, Format String: %s{formatString}"
                                
            if obj = null then
                String.Empty
            else
                // If this is a byte and the "R" format string, format it with Roman numerals.
                match obj with
                | :? byte as value when formatString.ToUpper().Equals "R" -> 
                    let mutable returnString = String.Empty

                    // Get the hundreds digit(s)
                    let struct (result, remainder) = Math.DivRem(value, 100uy)
                    if result > 0uy then
                        returnString <- String('C', int result)
                    let value = byte remainder
                    // Get the 50s digit
                    let struct (result, remainder) = Math.DivRem(value, 50uy)
                    if result = 1uy then
                        returnString <- returnString + "L"
                    let value = byte remainder
                    // Get the tens digit.
                    let struct (result, remainder) = Math.DivRem(value, 10uy)
                    if result > 0uy then
                        returnString <- returnString + String('X', int result)
                    let value = byte remainder 
                    // Get the fives digit.
                    let struct (result, remainder) = Math.DivRem(value, 5uy)
                    if result > 0uy then
                        returnString <- returnString + "V"
                    let value = byte remainder
                    // Add the ones digit.
                    if remainder > 0uy then 
                        returnString <- returnString + String('I', int remainder)
                    
                    // Check whether we have too many X characters.
                    let pos = returnString.IndexOf "XXXX"
                    if pos >= 0 then
                        let xPos = returnString.IndexOf "L" 
                        returnString <-
                            if xPos >= 0 && xPos = pos - 1 then
                                returnString.Replace("LXXXX", "XC")
                            else
                                returnString.Replace("XXXX", "XL")   
                    // Check whether we have too many I characters
                    let pos = returnString.IndexOf "IIII"
                    if pos >= 0 then
                        returnString <-
                            if returnString.IndexOf "V" >= 0 then
                                returnString.Replace("VIIII", "IX")
                            else
                                returnString.Replace("IIII", "IV")    
                    returnString 

                // Use default for all other formatting.
                | :? IFormattable as x ->
                    x.ToString(format, CultureInfo.CurrentCulture)
                | _ ->
                    string obj

let n = 10
let value = 16.935
let day = DateTime.Now
let provider = InterceptProvider()
String.Format(provider, "{0:N0}: {1:C2} on {2:d}\n", n, value, day)
|> printfn "%s"
String.Format(provider, "{0}: {1:F}\n", "Today: ", DateTime.Now.DayOfWeek)
|> printfn "%s"
String.Format(provider, "{0:X}, {1}, {2}\n", 2uy, 12uy, 199uy)
|> printfn "%s"
String.Format(provider, "{0:R}, {1:R}, {2:R}\n", 2uy, 12uy, 199uy)
|> printfn "%s"
// 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
Imports System.Globalization

Public Class InterceptProvider : Implements IFormatProvider, ICustomFormatter
   Public Function GetFormat(formatType As Type) As Object _
         Implements IFormatProvider.GetFormat
      If formatType Is GetType(ICustomFormatter) Then
         Return Me
      Else
         Return Nothing
      End If
   End Function

   Public Function Format(fmt As String, obj As Object, provider As IFormatProvider) As String _
         Implements ICustomFormatter.Format

      Dim formatString As String = If(fmt IsNot Nothing, fmt, "<null>")
      Console.WriteLine("Provider: {0}, Object: {1}, Format String: {2}",
                        provider, If(obj IsNot Nothing, obj, "<null>"), formatString)

      If obj Is Nothing Then Return String.Empty

      ' If this is a byte and the "R" format string, format it with Roman numerals.
      If TypeOf(obj) Is Byte AndAlso formatString.ToUpper.Equals("R") Then
         Dim value As Byte = CByte(obj)
         Dim remainder As Integer
         Dim result As Integer
         Dim returnString As String = String.Empty

         ' Get the hundreds digit(s)
         result = Math.DivRem(value, 100, remainder)
         If result > 0 Then returnString = New String("C"c, result)
         value = CByte(remainder)
         ' Get the 50s digit
         result = Math.DivRem(value, 50, remainder)
         If result = 1 Then returnString += "L"
         value = CByte(remainder)
         ' Get the tens digit.
         result = Math.DivRem(value, 10, remainder)
         If result > 0 Then returnString += New String("X"c, result)
         value = CByte(remainder)
         ' Get the fives digit.
         result = Math.DivRem(value, 5, remainder)
         If result > 0 Then returnString += "V"
         value = CByte(remainder)
         ' Add the ones digit.
         If remainder > 0 Then returnString += New String("I"c, remainder)

         ' Check whether we have too many X characters.
         Dim pos As Integer = returnString.IndexOf("XXXX")
         If pos >= 0 Then
            Dim xPos As Integer = returnString.IndexOf("L")
            If xPos >= 0 And xPos = pos - 1 Then
               returnString = returnString.Replace("LXXXX", "XC")
            Else
               returnString = returnString.Replace("XXXX", "XL")
            End If
         End If
         ' Check whether we have too many I characters
         pos = returnString.IndexOf("IIII")
         If pos >= 0 Then
            If returnString.IndexOf("V") >= 0 Then
               returnString = returnString.Replace("VIIII", "IX")
            Else
               returnString = returnString.Replace("IIII", "IV")
            End If
         End If
         Return returnString
      End If

      ' Use default for all other formatting.
      If TypeOf obj Is IFormattable Then
         Return CType(obj, IFormattable).ToString(fmt, CultureInfo.CurrentCulture)
      Else
         Return obj.ToString()
      End If
   End Function
End Class

Module Example
   Public Sub Main()
      Dim n As Integer = 10
      Dim value As Double = 16.935
      Dim day As DateTime = Date.Now
      Dim provider As New InterceptProvider()
      Console.WriteLine(String.Format(provider, "{0:N0}: {1:C2} on {2:d}", n, value, day))
      Console.WriteLine()
      Console.WriteLine(String.Format(provider, "{0}: {1:F}", "Today",
                                      CType(Date.Now.DayOfWeek, DayOfWeek)))
      Console.WriteLine()
      Console.WriteLine(String.Format(provider, "{0:X}, {1}, {2}\n",
                                      CByte(2), CByte(12), CByte(199)))
      Console.WriteLine()
      Console.WriteLine(String.Format(provider, "{0:R}, {1:R}, {2:R}",
                                      CByte(2), CByte(12), CByte(199)))
   End Sub
End Module
' 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

FAQ

String.Format メソッドの呼び出しよりも文字列補間を推奨するのはなぜですか?

文字列補間は次のとおりです。

  • 柔軟性が高くなります。 複合書式をサポートするメソッドの呼び出しを必要とせずに、任意の文字列で使用できます。 それ以外の場合は、 Format メソッドまたは複合書式をサポートする別のメソッド ( Console.WriteLineStringBuilder.AppendFormatなど) を呼び出す必要があります。
  • 読みやすい。 文字列に挿入する式は引数リストではなく補間式に表示されるため、挿入文字列はコード化および読み取りが容易になります。 挿入文字列は、文字列連結操作で使用して、より簡潔で明確なコードを生成することもできます。

次の 2 つのコード例を比較すると、文字列連結と複合書式設定メソッドの呼び出しに対する補間文字列の優位性が示されています。 次の例で複数の文字列連結操作を使用すると、詳細で読みにくいコードが生成されます。

string[] names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" };
string output = names[0] + ", " + names[1] + ", " + names[2] + ", " +
                names[3] + ", " + names[4] + ", " + names[5] + ", " +
                names[6];

output += "\n";
var date = DateTime.Now;
output += String.Format("It is {0:t} on {0:d}. The day of the week is {1}.",
                        date, date.DayOfWeek);
Console.WriteLine(output);
// The example displays the following output:
//     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
//     It is 10:29 AM on 1/8/2018. The day of the week is Monday.
open System

let names = [| "Balto"; "Vanya"; "Dakota"; "Samuel"; "Koani"; "Yiska"; "Yuma" |]
let output = 
    names[0] + ", " + names[1] + ", " + names[2] + ", " + 
    names[3] + ", " + names[4] + ", " + names[5] + ", " + 
    names[6] + "\n"

let date = DateTime.Now
output + String.Format("It is {0:t} on {0:d}. The day of the week is {1}.", date, date.DayOfWeek)
|> printfn "%s"
// The example displays the following output:
//     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
//     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

Module Example12
    Public Sub Main()
        Dim names = {"Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma"}
        Dim output = names(0) + ", " + names(1) + ", " + names(2) + ", " +
                   names(3) + ", " + names(4) + ", " + names(5) + ", " +
                   names(6)

        output += vbCrLf
        Dim dat = DateTime.Now
        output += String.Format("It is {0:t} on {0:d}. The day of the week is {1}.",
                              dat, dat.DayOfWeek)
        Console.WriteLine(output)
    End Sub
End Module
' The example displays the following output:
'     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
'     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

これに対し、次の例で挿入文字列を使用すると、前の例の文字列連結ステートメントや Format メソッドの呼び出しよりもはるかに明確で簡潔なコードが生成されます。

string[] names = { "Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma" };
string output = $"{names[0]}, {names[1]}, {names[2]}, {names[3]}, {names[4]}, " +
                $"{names[5]}, {names[6]}";

var date = DateTime.Now;
output += $"\nIt is {date:t} on {date:d}. The day of the week is {date.DayOfWeek}.";
Console.WriteLine(output);
// The example displays the following output:
//     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
//     It is 10:29 AM on 1/8/2018. The day of the week is Monday.
open System

let names = [| "Balto"; "Vanya"; "Dakota"; "Samuel"; "Koani"; "Yiska"; "Yuma" |]
let output = $"{names[0]}, {names[1]}, {names[2]}, {names[3]}, {names[4]}, {names[5]}, {names[6]}"  

let date = DateTime.Now
output + $"\nIt is {date:t} on {date:d}. The day of the week is {date.DayOfWeek}."
|> printfn "%s" 
// The example displays the following output:
//     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
//     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

Module Example13
    Public Sub Main()
        Dim names = {"Balto", "Vanya", "Dakota", "Samuel", "Koani", "Yiska", "Yuma"}
        Dim output = $"{names(0)}, {names(1)}, {names(2)}, {names(3)}, {names(4)}, " +
                   $"{names(5)}, {names(6)}"

        Dim dat = DateTime.Now
        output += $"{vbCrLf}It is {dat:t} on {dat:d}. The day of the week is {dat.DayOfWeek}."
        Console.WriteLine(output)
    End Sub
End Module
' The example displays the following output:
'     Balto, Vanya, Dakota, Samuel, Koani, Yiska, Yuma
'     It is 10:29 AM on 1/8/2018. The day of the week is Monday.

定義済みの書式指定文字列はどこにありますか?

書式指定項目を置き換える結果文字列の配置を制御するにはどうすればよいですか?

書式項目の一般的な構文は次のとおりです。

{index[,width][: formatString]}

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

小数点区切り記号の後の桁数を制御するにはどうすればよいですか?

"D" (整数でのみ使用)、"G"、"R"、および "X" を除くすべての 標準数値書式指定文字列 では、結果文字列の 10 進数の数を定義する精度指定子を使用できます。 次の例では、標準の数値書式指定文字列を使用して、結果文字列の 10 進数の数を制御します。

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 output like the following:
//       $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 %
open System

let values: obj list = [ 1603, 1794.68235, 15436.14 ]
for value in values do
   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.)
   |> printfn "%s"
// The example displays output like the following:
//       $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 %
Module Example7
    Public Sub Main()
        Dim values() As Object = {1603, 1794.68235, 15436.14}
        Dim result As String
        For Each value In values
            result = String.Format("{0,12:C2}   {0,12:E3}   {0,12:F4}   {0,12:N3}  {1,12:P2}",
                                value, CDbl(value) / 10000)
            Console.WriteLine(result)
            Console.WriteLine()
        Next
    End Sub
End Module
' 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 %

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

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
let value = 16309.5436m
String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}", value)
|> printfn "%s"
// The example displays the following output:
//        16309.54360    16,309.54    16309.544
Module Example8
    Public Sub Main()
        Dim value As Decimal = 16309.5436D
        Dim result As String = String.Format("{0,12:#.00000} {0,12:0,000.00} {0,12:000.00#}",
                                           value)
        Console.WriteLine(result)
    End Sub
End Module
' The example displays the following output:
'    16309.54360    16,309.54    16309.544

整数の桁数を制御するにはどうすればよいですか?

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

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
open System

let value = 1326
String.Format("{0,10:D6} {0,10:X8}", value)
|> printfn "%s"
// The example displays the following output:
//     001326   0000052E
Module Example10
    Public Sub Main()
        Dim value As Integer = 1326
        Dim result As String = String.Format("{0,10:D6} {0,10:X8}", value)
        Console.WriteLine(result)
    End Sub
End Module
' The example displays the following output:
'       001326   0000052E

次の例に示すように、整数または浮動小数点数に先行ゼロを埋め込んで、"0" カスタム数値書式指定子を使用して、指定した整数桁数の結果文字列を生成できます。

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
open System

let value = 16342
String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}", value)
|> printfn "%s"
// The example displays the following output:
//           00016342       00016342.000    0,000,016,342.0
Module Example9
    Public Sub Main()
        Dim value As Integer = 16342
        Dim result As String = String.Format("{0,18:00000000} {0,18:00000000.000} {0,18:000,0000,000.0}",
                                           value)
        Console.WriteLine(result)
    End Sub
End Module
' The example displays the following output:
'           00016342       00016342.000    0,000,016,342.0

書式リストに含めることができる項目の数はいくつですか?

実際的な制限はありません。 Format(IFormatProvider, String, Object[]) メソッドの 2 番目のパラメーターには、ParamArrayAttribute属性でタグが付けられます。これにより、区切りリストまたはオブジェクト配列を書式リストとして含めることができます。

結果文字列にリテラルの中かっこ ("{" と "}") を含めるにはどうすればよいですか?

たとえば、次のメソッド呼び出しでFormatException例外が発生しないようにするにはどうしたらよいでしょうか。

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

一重の左中かっこまたは右中かっこは、常に書式指定項目の先頭または末尾として解釈されます。 リテラル項目として解釈するには、エスケープする必要があります。 中かっこをエスケープするには、次のメソッド呼び出しのように、中かっこをもう 1 つ追加して、"{" と "}" の代わりに "{{" と "}}" を使用します。

string result;
int nOpen = 1;
int nClose = 2;
result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
                       nOpen, nClose);
Console.WriteLine(result);
let result =
    String.Format("The text has {0} '{{' characters and {1} '}}' characters.", nOpen, nClose)
result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
                 nOpen, nClose)

ただし、エスケープされた中かっこであっても、誤って解釈される可能性があります。 次の例に示すように、中かっこを書式リストに含め、書式項目を使用して結果文字列に挿入することをお勧めします。

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

String.Format メソッドを呼び出すと FormatException がスローされるのはなぜですか?

例外の最も一般的な原因は、書式指定項目のインデックスが書式リスト内のオブジェクトに対応していないということです。 通常、これは、書式指定項目のインデックスの番号が間違っているか、オブジェクトを書式リストに含め忘れたことを示します。 エスケープされていない左中かっこまたは右中かっこ文字を含めようとすると、FormatException がスローされます。 場合によっては、例外は入力ミスの結果です。たとえば、一般的な間違いは、"{" (左中かっこ) ではなく "[" (左角かっこ) を誤って入力することです。

Format(System.IFormatProvider,System.String,System.Object[]) メソッドがパラメーター配列をサポートしている場合、配列を使用するときにコードで例外がスローされるのはなぜですか?

たとえば、次のコードは FormatException 例外を発生させます。

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($"{numbers} + {1} + {2} = {3}");
open System

let rnd = Random()
let mutable total = 0
let numbers = Array.zeroCreate<int> 4
for i = 0 to 2 do
   let number = rnd.Next 1001
   numbers[i] <- number
   total <- total + number
numbers[3] <- total
Console.WriteLine("{0} + {1} + {2} = {3}", numbers)

Module Example5a
    Public Sub Main()
        Dim rnd As New Random()
        Dim numbers(3) As Integer
        Dim total As Integer = 0
        For ctr = 0 To 2
            Dim number As Integer = rnd.Next(1001)
            numbers(ctr) = number
            total += number
        Next
        numbers(3) = total
        Console.WriteLine("{0} + {1} + {2} = {3}", numbers)
    End Sub
End Module

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

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

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($"{values} + {1} + {2} = {3}");
open System

let rnd = Random()
let numbers = Array.zeroCreate<int> 4
let mutable total = 0
for i = 0 to 2 do
   let number = rnd.Next 1001
   numbers[i] <- number
   total <- total + number
numbers[3] <- total
let values = Array.zeroCreate<obj> numbers.Length
numbers.CopyTo(values, 0)
Console.WriteLine("{0} + {1} + {2} = {3}", values)
Imports System.Collections.Generic

Module Example6
    Public Sub Main()
        Dim rnd As New Random()
        Dim numbers(3) As Integer
        Dim total As Integer = 0
        For ctr = 0 To 2
            Dim number As Integer = rnd.Next(1001)
            numbers(ctr) = number
            total += number
        Next
        numbers(3) = total
        Dim values(numbers.Length - 1) As Object
        numbers.CopyTo(values, 0)
        Console.WriteLine("{0} + {1} + {2} = {3}", values)
    End Sub
End Module

注釈

Important

String.Format メソッドを呼び出したり、複合書式指定文字列を使用したりする代わりに、言語でサポートされている場合は挿入文字列を使用できます。 補間文字列は、補間されている式を含む文字列です。 各挿入式は式の値によって解かれ、文字列が割り当てられるとき、結果文字列に含まれます。 詳細については、「 文字列補間 (C# リファレンス) 」および「 挿入文字列 (Visual Basic リファレンス)」を参照してください

Format(IFormatProvider, String, Object, Object, Object)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, System::Object ^ arg0, System::Object ^ arg1, System::Object ^ arg2);
public static string Format(IFormatProvider provider, string format, object arg0, object arg1, object arg2);
public static string Format(IFormatProvider? provider, string format, object? arg0, object? arg1, object? arg2);
static member Format : IFormatProvider * string * obj * obj * obj -> string
Public Shared Function Format (provider As IFormatProvider, format As String, arg0 As Object, arg1 As Object, arg2 As Object) As String

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

arg0
Object

書式設定する最初のオブジェクト。

arg1
Object

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

arg2
Object

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

返品

書式項目がformatarg0、およびarg1の文字列表現に置き換えられたarg2のコピー。

例外

formatnullです。

format が無効です。

-又は-

書式指定項目のインデックスが 0 より小さいか、2 より大きい。

注釈

Important

String.Format メソッドを呼び出したり、複合書式指定文字列を使用したりする代わりに、言語でサポートされている場合は挿入文字列を使用できます。 補間文字列は、補間されている式を含む文字列です。 各挿入式は式の値によって解かれ、文字列が割り当てられるとき、結果文字列に含まれます。 詳細については、「 文字列補間 (C# リファレンス) 」および「 挿入文字列 (Visual Basic リファレンス)」を参照してください

このメソッドは 、複合書式指定機能を 使用して、3 つの式を文字列表現に変換し、それらの表現を文字列に埋め込みます。 変換を実行する場合、メソッドはカルチャに依存する書式設定またはカスタム フォーマッタを使用します。 このメソッドは、Object メソッドを呼び出すか、オブジェクトの対応する書式指定項目に書式指定文字列が含まれている場合は、ToString(String,IFormatProvider) メソッドを呼び出して、各引数を文字列形式に変換します。 これらのメソッドが存在しない場合は、オブジェクトのパラメーターなしの ToString メソッドを 呼び出します。

ただし、 String.Format メソッドを呼び出すときに、呼び出す特定のオーバーロードに焦点を当てる必要はありません。 代わりに、カルチャ依存またはカスタム書式指定を提供するオブジェクトと、1 つ以上の書式指定項目を含む 複合書式指定文字列 を使用してメソッドを呼び出すことができます。 各書式項目に数値インデックスを割り当てます。最初のインデックスは 0 から始まります。 最初の文字列に加えて、メソッド呼び出しにはインデックス値を持つ数の追加引数が必要です。 たとえば、書式指定項目のインデックスが 0 と 1 の文字列には、2 つの引数が必要です。インデックスが 0 ~ 5 の 1 つは 6 個の引数を持つ必要があります。 言語コンパイラは、 String.Format メソッドの特定のオーバーロードに対するメソッド呼び出しを解決します。

String.Format メソッドの使用に関する詳細なドキュメントについては、「String.Format メソッドの概要」および「どのメソッドを呼び出しますか?」を参照してください。

適用対象

Format(IFormatProvider, String, Object, Object)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, System::Object ^ arg0, System::Object ^ arg1);
public static string Format(IFormatProvider provider, string format, object arg0, object arg1);
public static string Format(IFormatProvider? provider, string format, object? arg0, object? arg1);
static member Format : IFormatProvider * string * obj * obj -> string
Public Shared Function Format (provider As IFormatProvider, format As String, arg0 As Object, arg1 As Object) As String

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

arg0
Object

書式設定する最初のオブジェクト。

arg1
Object

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

返品

書式項目がformatarg0の文字列表現に置き換えられるarg1のコピー。

例外

formatnullです。

format が無効です。

-又は-

書式項目のインデックスが 0 または 1 ではありません。

注釈

Important

String.Format メソッドを呼び出したり、複合書式指定文字列を使用したりする代わりに、言語でサポートされている場合は挿入文字列を使用できます。 補間文字列は、補間されている式を含む文字列です。 各挿入式は式の値によって解かれ、文字列が割り当てられるとき、結果文字列に含まれます。 詳細については、「 文字列補間 (C# リファレンス) 」および「 挿入文字列 (Visual Basic リファレンス)」を参照してください

このメソッドでは、 複合書式指定機能を 使用して、2 つの式を文字列表現に変換し、それらの表現を文字列に埋め込みます。 変換を実行する場合、メソッドはカルチャに依存する書式設定またはカスタム フォーマッタを使用します。 このメソッドは、Object メソッドを呼び出すか、オブジェクトの対応する書式指定項目に書式指定文字列が含まれている場合は、ToString(String,IFormatProvider) メソッドを呼び出して、各引数を文字列形式に変換します。 これらのメソッドが存在しない場合は、オブジェクトのパラメーターなしの ToString メソッドを 呼び出します。

ただし、 String.Format メソッドを呼び出すときに、呼び出す特定のオーバーロードに焦点を当てる必要はありません。 代わりに、カルチャ依存またはカスタム書式指定を提供するオブジェクトと、1 つ以上の書式指定項目を含む 複合書式指定文字列 を使用してメソッドを呼び出すことができます。 各書式項目に数値インデックスを割り当てます。最初のインデックスは 0 から始まります。 最初の文字列に加えて、メソッド呼び出しにはインデックス値を持つ数の追加引数が必要です。 たとえば、書式指定項目のインデックスが 0 と 1 の文字列には、2 つの引数が必要です。インデックスが 0 ~ 5 の 1 つは 6 個の引数を持つ必要があります。 言語コンパイラは、 String.Format メソッドの特定のオーバーロードに対するメソッド呼び出しを解決します。

String.Format メソッドの使用に関する詳細なドキュメントについては、「String.Format メソッドの概要」および「どのメソッドを呼び出しますか?」を参照してください。

適用対象

Format(String, Object, Object)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
 static System::String ^ Format(System::String ^ format, System::Object ^ arg0, System::Object ^ arg1);
public static string Format(string format, object arg0, object arg1);
public static string Format(string format, object? arg0, object? arg1);
static member Format : string * obj * obj -> string
Public Shared Function Format (format As String, arg0 As Object, arg1 As Object) As String

パラメーター

arg0
Object

書式設定する最初のオブジェクト。

arg1
Object

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

返品

書式項目がformatarg0の文字列表現に置き換えられるarg1のコピー。

例外

formatnullです。

format が無効です。

-又は-

書式項目のインデックスが 0 または 1 ではありません。

注釈

Important

String.Format メソッドを呼び出したり、複合書式指定文字列を使用したりする代わりに、言語でサポートされている場合は挿入文字列を使用できます。 補間文字列は、補間されている式を含む文字列です。 各挿入式は式の値によって解かれ、文字列が割り当てられるとき、結果文字列に含まれます。 詳細については、「 文字列補間 (C# リファレンス) 」および「 挿入文字列 (Visual Basic リファレンス)」を参照してください

このメソッドは 、複合書式設定機能を 使用して、2 つの式の値を文字列表現に変換し、それらの表現を文字列に埋め込みます。

ただし、 String.Format メソッドを呼び出すときに、呼び出す特定のオーバーロードに焦点を当てる必要はありません。 代わりに、1 つ以上の書式指定項目を含む 複合書式指定文字列 を使用してメソッドを呼び出すことができます。 各書式項目に数値インデックスを割り当てます。最初のインデックスは 0 から始まります。 最初の文字列に加えて、メソッド呼び出しにはインデックス値を持つ数の追加引数が必要です。 たとえば、書式指定項目のインデックスが 0 と 1 の文字列には、2 つの引数が必要です。インデックスが 0 ~ 5 の 1 つは 6 個の引数を持つ必要があります。 言語コンパイラは、 String.Format メソッドの特定のオーバーロードに対するメソッド呼び出しを解決します。

String.Format メソッドの使用に関する詳細なドキュメントについては、「String.Format メソッドの概要」および「どのメソッドを呼び出しますか?」を参照してください。

例: 2 つの引数を書式設定する

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

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 output like the following:
//       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
open System
open System.Collections.Generic

let temperatureInfo = Dictionary<DateTime, float>() 
temperatureInfo.Add(DateTime(2010, 6, 1, 14, 0, 0), 87.46)
temperatureInfo.Add(DateTime(2010, 12, 1, 10, 0, 0), 36.81)

printfn $"Temperature Information:\n"
for item in temperatureInfo do
   String.Format("Temperature at {0,8:t} on {0,9:d}: {1,5:N1}°F", item.Key, item.Value)
   |> printfn "%s"
// The example displays output like the following:
//       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
Imports System.Collections.Generic

Module Example
   Public Sub Main()
      Dim temperatureInfo As New Dictionary(Of Date, Double) 
      temperatureInfo.Add(#6/1/2010 2:00PM#, 87.46)
      temperatureInfo.Add(#12/1/2010 10:00AM#, 36.81)
      
      Console.WriteLine("Temperature Information:")
      Console.WriteLine()
      Dim output As String   
      For Each 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)
      Next
   End Sub
End Module
' 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(IFormatProvider, CompositeFormat, ReadOnlySpan<Object>)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::Text::CompositeFormat ^ format, ReadOnlySpan<System::Object ^> args);
public static string Format(IFormatProvider? provider, System.Text.CompositeFormat format, scoped ReadOnlySpan<object?> args);
public static string Format(IFormatProvider? provider, System.Text.CompositeFormat format, ReadOnlySpan<object?> args);
static member Format : IFormatProvider * System.Text.CompositeFormat * ReadOnlySpan<obj> -> string
Public Shared Function Format (provider As IFormatProvider, format As CompositeFormat, args As ReadOnlySpan(Of Object)) As String

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

format
CompositeFormat

CompositeFormat です。

args
ReadOnlySpan<Object>

書式設定するオブジェクトのスパン。

返品

書式設定された文字列。

例外

formatnullです。

書式指定項目のインデックスは、指定された引数の数以上です。

適用対象

Format(IFormatProvider, CompositeFormat, Object[])

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::Text::CompositeFormat ^ format, ... cli::array <System::Object ^> ^ args);
public static string Format(IFormatProvider? provider, System.Text.CompositeFormat format, params object?[] args);
static member Format : IFormatProvider * System.Text.CompositeFormat * obj[] -> string
Public Shared Function Format (provider As IFormatProvider, format As CompositeFormat, ParamArray args As Object()) As String

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

format
CompositeFormat

CompositeFormat です。

args
Object[]

書式設定するオブジェクトの配列。

返品

書式設定された文字列。

例外

format または argsnull

書式指定項目のインデックスは、指定された引数の数以上です。

適用対象

Format(String, Object, Object, Object)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
 static System::String ^ Format(System::String ^ format, System::Object ^ arg0, System::Object ^ arg1, System::Object ^ arg2);
public static string Format(string format, object arg0, object arg1, object arg2);
public static string Format(string format, object? arg0, object? arg1, object? arg2);
static member Format : string * obj * obj * obj -> string
Public Shared Function Format (format As String, arg0 As Object, arg1 As Object, arg2 As Object) As String

パラメーター

arg0
Object

書式設定する最初のオブジェクト。

arg1
Object

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

arg2
Object

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

返品

書式項目がformatarg0、およびarg1の文字列表現に置き換えられたarg2のコピー。

例外

formatnullです。

format が無効です。

-又は-

書式指定項目のインデックスが 0 より小さいか、2 より大きい。

注釈

Important

String.Format メソッドを呼び出したり、複合書式指定文字列を使用したりする代わりに、言語でサポートされている場合は挿入文字列を使用できます。 補間文字列は、補間されている式を含む文字列です。 各挿入式は式の値によって解かれ、文字列が割り当てられるとき、結果文字列に含まれます。 詳細については、「 文字列補間 (C# リファレンス) 」および「 挿入文字列 (Visual Basic リファレンス)」を参照してください

このメソッドは 、複合書式設定機能を 使用して、3 つの式の値を文字列表現に変換し、それらの表現を文字列に埋め込みます。

ただし、 String.Format メソッドを呼び出すときに、呼び出す特定のオーバーロードに焦点を当てる必要はありません。 代わりに、1 つ以上の書式指定項目を含む 複合書式指定文字列 を使用してメソッドを呼び出すことができます。 各書式項目に数値インデックスを割り当てます。最初のインデックスは 0 から始まります。 最初の文字列に加えて、メソッド呼び出しにはインデックス値を持つ数の追加引数が必要です。 たとえば、書式指定項目のインデックスが 0 と 1 の文字列には、2 つの引数が必要です。インデックスが 0 ~ 5 の 1 つは 6 個の引数を持つ必要があります。 言語コンパイラは、 String.Format メソッドの特定のオーバーロードに対するメソッド呼び出しを解決します。

String.Format メソッドの使用に関する詳細なドキュメントについては、「String.Format メソッドの概要」および「どのメソッドを呼び出しますか?」を参照してください。

例: 3 つの引数の書式を設定する

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

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)
open System

let formatString = 
    "    {0,10} ({0,8:X8})\nAnd {1,10} ({1,8:X8})\n  = {2,10} ({2,8:X8})"

let value1 = 16932
let value2 = 15421
String.Format(formatString, value1, value2, value1 &&& value2)
|> printfn "%s"
// The example displays the following output:
//                16932 (00004224)
//       And      15421 (00003C3D)
//         =         36 (00000024)
Public Module Example
   Public Sub Main()
      Dim formatString As String = "    {0,10} ({0,8:X8})" + vbCrLf +  _
                                   "And {1,10} ({1,8:X8})" + vbCrLf + _
                                   "  = {2,10} ({2,8:X8})"
      Dim value1 As Integer = 16932
      Dim value2 As Integer = 15421
      Dim result As String = String.Format(formatString, _
                                           value1, value2, value1 And value2)
      Console.WriteLine(result)                          
   End Sub
End Module
' The example displays the following output:
'                16932 (00004224)
'       And      15421 (00003C3D)
'         =         36 (00000024)

こちらもご覧ください

適用対象

Format(IFormatProvider, String, Object[])

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

文字列内の書式指定項目を、指定した配列内の対応するオブジェクトの文字列形式に置き換えます。 パラメーターは、カルチャ固有の書式設定情報を提供します。

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, ... cli::array <System::Object ^> ^ args);
public static string Format(IFormatProvider provider, string format, params object[] args);
public static string Format(IFormatProvider? provider, string format, params object?[] args);
static member Format : IFormatProvider * string * obj[] -> string
Public Shared Function Format (provider As IFormatProvider, format As String, ParamArray args As Object()) As String

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

args
Object[]

書式設定する 0 個以上のオブジェクトを含むオブジェクト配列。

返品

書式項目が、format内の対応するオブジェクトの文字列形式に置き換えられたargsのコピー。

例外

format または argsnull

format が無効です。

-又は-

書式指定項目のインデックスが 0 未満であるか、 args 配列の長さ以上です。

注釈

Important

String.Format メソッドを呼び出したり、複合書式指定文字列を使用したりする代わりに、言語でサポートされている場合は挿入文字列を使用できます。 補間文字列は、補間されている式を含む文字列です。 各挿入式は式の値によって解かれ、文字列が割り当てられるとき、結果文字列に含まれます。 詳細については、「 文字列補間 (C# リファレンス) 」および「 挿入文字列 (Visual Basic リファレンス)」を参照してください

このメソッドは 、複合書式指定機能を 使用して、4 つ以上の式を文字列表現に変換し、それらの表現を文字列に埋め込みます。 変換を実行する場合、メソッドはカルチャに依存する書式設定またはカスタム フォーマッタを使用します。 このメソッドは、Object メソッドを呼び出すか、オブジェクトの対応する書式指定項目に書式指定文字列が含まれている場合は、ToString(String,IFormatProvider) メソッドを呼び出して、各引数を文字列形式に変換します。 これらのメソッドが存在しない場合は、オブジェクトのパラメーターなしの ToString メソッドを 呼び出します。

ただし、 String.Format メソッドを呼び出すときに、呼び出す特定のオーバーロードに焦点を当てる必要はありません。 代わりに、カルチャ依存またはカスタム書式指定を提供するオブジェクトと、1 つ以上の書式指定項目を含む 複合書式指定文字列 を使用してメソッドを呼び出すことができます。 各書式項目に数値インデックスを割り当てます。最初のインデックスは 0 から始まります。 最初の文字列に加えて、メソッド呼び出しにはインデックス値を持つ数の追加引数が必要です。 たとえば、書式指定項目のインデックスが 0 と 1 の文字列には、2 つの引数が必要です。インデックスが 0 ~ 5 の 1 つは 6 個の引数を持つ必要があります。 言語コンパイラは、 String.Format メソッドの特定のオーバーロードに対するメソッド呼び出しを解決します。

String.Format メソッドの使用に関する詳細なドキュメントについては、「String.Format メソッドの概要」および「どのメソッドを呼び出しますか?」を参照してください。

例: カルチャに依存する書式設定

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

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)
{
   System.Globalization.CultureInfo culture = new System.Globalization.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
open System
open System.Globalization

let cultureNames = [| "en-US"; "fr-FR"; "de-DE"; "es-ES" |]

let dateToDisplay = DateTime(2009, 9, 1, 18, 32, 0)
let value = 9164.32

printfn "Culture     Date                                Value\n"
for cultureName in cultureNames do
    let culture = CultureInfo cultureName
    String.Format(culture, "{0,-11} {1,-35:D} {2:N}", culture.Name, dateToDisplay, value)
    |> printfn "%s"
// 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
Imports System.Globalization

Module Example2
   Public Sub Main()
      Dim cultureNames() As String = { "en-US", "fr-FR", "de-DE", "es-ES" }

      Dim dateToDisplay As Date = #9/1/2009 6:32PM#
      Dim value As Double = 9164.32

      Console.WriteLine("Culture     Date                                Value")
      Console.WriteLine()
      For Each cultureName As String In cultureNames
         Dim culture As New CultureInfo(cultureName)
         Dim output As String = String.Format(culture, "{0,-11} {1,-35:D} {2:N}", _
                                              culture.Name, dateToDisplay, value)
         Console.WriteLine(output)
      Next
   End Sub
End Module
' 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

こちらもご覧ください

適用対象

Format(IFormatProvider, String, Object)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

指定した文字列内の書式指定項目を、対応するオブジェクトの文字列形式に置き換えます。 パラメーターは、カルチャ固有の書式設定情報を提供します。

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, System::Object ^ arg0);
public static string Format(IFormatProvider provider, string format, object arg0);
public static string Format(IFormatProvider? provider, string format, object? arg0);
static member Format : IFormatProvider * string * obj -> string
Public Shared Function Format (provider As IFormatProvider, format As String, arg0 As Object) As String

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

arg0
Object

書式設定するオブジェクト。

返品

formatの文字列形式で書式設定項目が置き換えられたarg0のコピー。

例外

formatnullです。

format が無効です。

-又は-

書式項目のインデックスが 0 ではありません。

注釈

Important

String.Format メソッドを呼び出したり、複合書式指定文字列を使用したりする代わりに、言語でサポートされている場合は挿入文字列を使用できます。 補間文字列は、補間されている式を含む文字列です。 各挿入式は式の値によって解かれ、文字列が割り当てられるとき、結果文字列に含まれます。 詳細については、「 文字列補間 (C# リファレンス) 」および「 挿入文字列 (Visual Basic リファレンス)」を参照してください

このメソッドは 、複合書式設定機能を 使用して、式の値を文字列形式に変換し、その表現を文字列に埋め込みます。 変換を実行する場合、メソッドはカルチャに依存する書式設定またはカスタム フォーマッタを使用します。 このメソッドは、arg0 メソッドを呼び出してを文字列形式に変換します。また、オブジェクトの対応する書式指定項目に書式指定文字列が含まれている場合は、その ToString(String,IFormatProvider) メソッドを呼び出して変換します。 これらのメソッドが存在しない場合は、オブジェクトのパラメーターなしの ToString メソッドを 呼び出します。

ただし、 String.Format メソッドを呼び出すときに、呼び出す特定のオーバーロードに焦点を当てる必要はありません。 代わりに、カルチャ依存またはカスタム書式指定を提供するオブジェクトと、1 つ以上の書式指定項目を含む 複合書式指定文字列 を使用してメソッドを呼び出すことができます。 各書式項目に数値インデックスを割り当てます。最初のインデックスは 0 から始まります。 最初の文字列に加えて、メソッド呼び出しにはインデックス値を持つ数の追加引数が必要です。 たとえば、書式指定項目のインデックスが 0 と 1 の文字列には、2 つの引数が必要です。インデックスが 0 ~ 5 の 1 つは 6 個の引数を持つ必要があります。 言語コンパイラは、 String.Format メソッドの特定のオーバーロードに対するメソッド呼び出しを解決します。

String.Format メソッドの使用に関する詳細なドキュメントについては、「String.Format メソッドの概要」および「どのメソッドを呼び出しますか?」を参照してください。

適用対象

Format(String, ReadOnlySpan<Object>)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
 static System::String ^ Format(System::String ^ format, ReadOnlySpan<System::Object ^> args);
public static string Format(string format, scoped ReadOnlySpan<object?> args);
static member Format : string * ReadOnlySpan<obj> -> string
Public Shared Function Format (format As String, args As ReadOnlySpan(Of Object)) As String

パラメーター

args
ReadOnlySpan<Object>

書式設定する 0 個以上のオブジェクトを含むオブジェクト スパン。

返品

書式項目が、format内の対応するオブジェクトの文字列形式に置き換えられたargsのコピー。

適用対象

Format(String, Object[])

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
 static System::String ^ Format(System::String ^ format, ... cli::array <System::Object ^> ^ args);
public static string Format(string format, params object[] args);
public static string Format(string format, params object?[] args);
static member Format : string * obj[] -> string
Public Shared Function Format (format As String, ParamArray args As Object()) As String

パラメーター

args
Object[]

書式設定する 0 個以上のオブジェクトを含むオブジェクト配列。

返品

書式項目が、format内の対応するオブジェクトの文字列形式に置き換えられたargsのコピー。

例外

format または argsnull

format が無効です。

-又は-

書式指定項目のインデックスが 0 未満であるか、 args 配列の長さ以上です。

注釈

Important

String.Format メソッドを呼び出したり、複合書式指定文字列を使用したりする代わりに、言語でサポートされている場合は挿入文字列を使用できます。 補間文字列は、補間されている式を含む文字列です。 各挿入式は式の値によって解かれ、文字列が割り当てられるとき、結果文字列に含まれます。 詳細については、「 文字列補間 (C# リファレンス) 」および「 挿入文字列 (Visual Basic リファレンス)」を参照してください

このメソッドは 、複合書式指定機能を 使用して、4 つ以上の式の値を文字列表現に変換し、それらの表現を文字列に埋め込みます。 args パラメーターは System.ParamArrayAttribute 属性でマークされているため、オブジェクトを個々の引数またはObject配列としてメソッドに渡すことができます。

ただし、 String.Format メソッドを呼び出すときに、呼び出す特定のオーバーロードに焦点を当てる必要はありません。 代わりに、1 つ以上の書式指定項目を含む 複合書式指定文字列 を使用してメソッドを呼び出すことができます。 各書式項目に数値インデックスを割り当てます。最初のインデックスは 0 から始まります。 最初の文字列に加えて、メソッド呼び出しにはインデックス値を持つ数の追加引数が必要です。 たとえば、書式指定項目のインデックスが 0 と 1 の文字列には、2 つの引数が必要です。インデックスが 0 ~ 5 の 1 つは 6 個の引数を持つ必要があります。 言語コンパイラは、 String.Format メソッドの特定のオーバーロードに対するメソッド呼び出しを解決します。

String.Format メソッドの使用に関する詳細なドキュメントについては、「String.Format メソッドの概要」および「どのメソッドを呼び出しますか?」を参照してください。

例: 3 つ以上の引数を書式設定する

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

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 output like the following:
//       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)
let date1 = DateTime(2009, 7, 1)
let hiTime = TimeSpan(14, 17, 32)
let hiTemp = 62.1m 
let loTime = TimeSpan(3, 16, 10)
let loTemp = 54.8m 

String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", date1, hiTime, hiTemp, loTime, loTemp)
|> printfn "%s\n"
      
String.Format("Temperature on {0:d}:\n{1,11}: {2} degrees (hi)\n{3,11}: {4} degrees (lo)", [| date1 :> obj; hiTime; hiTemp; loTime; loTemp |])
|> printfn "%s"
// The example displays output like the following:
//       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)
Module Example
   Public Sub Main()
      Dim date1 As Date = #7/1/2009#
      Dim hiTime As New TimeSpan(14, 17, 32)
      Dim hiTemp As Decimal = 62.1d 
      Dim loTime As New TimeSpan(3, 16, 10)
      Dim loTemp As Decimal = 54.8d 

      Dim result1 As String = String.Format("Temperature on {0:d}:{5}{1,11}: {2} degrees (hi){5}{3,11}: {4} degrees (lo)", _
                                           date1, hiTime, hiTemp, loTime, loTemp, vbCrLf)
      Console.WriteLine(result1)
      Console.WriteLine()
           
      Dim result2 As String = String.Format("Temperature on {0:d}:{5}{1,11}: {2} degrees (hi){5}{3,11}: {4} degrees (lo)", _
                                            New Object() { date1, hiTime, hiTemp, loTime, loTemp, vbCrLf })
      Console.WriteLine(result2)                                            
   End Sub
End Module
' 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 FormatExample10
{
   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
open System

type CityInfo =
  { Name: string
    Population: int
    Area: Decimal
    Year: int }

let showPopulationData city =
    let args: obj[] = [| city.Name; city.Year; city.Population; city.Area |]
    String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", args)
    |> printfn "%s"

{ Name = "New York"; Population = 8175133; Area = 302.64m; Year = 2010 }
|> showPopulationData

 
{ Name = "Seattle"; Population = 608660; Area = 83.94m; Year = 2010 }      
|> showPopulationData 

// 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
Public Class CityInfo
   Public Sub New(name As String, population As Integer, area As Decimal, year As Integer)
      Me.Name = name
      Me.Population = population
      Me.Area = area
      Me.Year = year
   End Sub
   
   Public ReadOnly Name As String
   Public ReadOnly Population As Integer
   Public ReadOnly Area As Decimal
   Public ReadOnly Year As Integer
End Class

Module Example
   Public Sub Main()
      Dim nyc2010 As New CityInfo("New York", 8175133, 302.64d, 2010)
      ShowPopulationData(nyc2010)
      Dim sea2010 As New CityInfo("Seattle", 608660, 83.94d, 2010)      
      ShowPopulationData(sea2010) 
   End Sub
   
   Private Sub ShowPopulationData(city As CityInfo)
      Dim args() As Object = { city.Name, city.Year, city.Population, city.Area }
      Dim result = String.Format("{0} in {1}: Population {2:N0}, Area {3:N1} sq. feet", args)
      Console.WriteLine(result) 
   End Sub
End Module
' 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(String, Object)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
 static System::String ^ Format(System::String ^ format, System::Object ^ arg0);
public static string Format(string format, object arg0);
public static string Format(string format, object? arg0);
static member Format : string * obj -> string
Public Shared Function Format (format As String, arg0 As Object) As String

パラメーター

arg0
Object

書式設定するオブジェクト。

返品

書式項目がformatの文字列形式に置き換えられるarg0のコピー。

例外

formatnullです。

formatの書式項目が無効です。

-又は-

書式項目のインデックスが 0 ではありません。

注釈

Important

String.Format メソッドを呼び出したり、複合書式指定文字列を使用したりする代わりに、言語でサポートされている場合は挿入文字列を使用できます。 補間文字列は、補間されている式を含む文字列です。 各挿入式は式の値によって解かれ、文字列が割り当てられるとき、結果文字列に含まれます。 詳細については、「 文字列補間 (C# リファレンス) 」および「 挿入文字列 (Visual Basic リファレンス)」を参照してください

このメソッドは 、複合書式設定機能を 使用して、式の値を文字列形式に変換し、その表現を文字列に埋め込みます。

ただし、 String.Format メソッドを呼び出すときに、呼び出す特定のオーバーロードに焦点を当てる必要はありません。 代わりに、1 つ以上の書式指定項目を含む 複合書式指定文字列 を使用してメソッドを呼び出すことができます。 各書式項目に数値インデックスを割り当てます。最初のインデックスは 0 から始まります。 最初の文字列に加えて、メソッド呼び出しにはインデックス値を持つ数の追加引数が必要です。 たとえば、書式指定項目のインデックスが 0 と 1 の文字列には、2 つの引数が必要です。インデックスが 0 ~ 5 の 1 つは 6 個の引数を持つ必要があります。 言語コンパイラは、 String.Format メソッドの特定のオーバーロードに対するメソッド呼び出しを解決します。

String.Format メソッドの使用に関する詳細なドキュメントについては、「String.Format メソッドの概要」および「どのメソッドを呼び出しますか?」を参照してください。

例: 1 つの引数の書式設定

次の例では、 Format(String, Object) メソッドを使用して、文字列の途中に個人の年齢を埋め込みます。

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.
let birthdate = DateTime(1993, 7, 28)
let dates = 
    [ DateTime(1993, 8, 16) 
      DateTime(1994, 7, 28)
      DateTime(2000, 10, 16)
      DateTime(2003, 7, 27)
      DateTime(2007, 5, 27) ]

for dateValue in dates do
    let interval = dateValue - birthdate
    // Get the approximate number of years, without accounting for leap years.
    let years = (int interval.TotalDays) / 365
    // See if adding the number of years exceeds dateValue.
    if birthdate.AddYears years <= dateValue then
        String.Format("You are now {0} years old.", years)
    else
        String.Format("You are now {0} years old.", years - 1)
    |> printfn "%s"
// 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.
Module Example
   Public Sub Main()
      Dim birthdate As Date = #7/28/1993#
      Dim dates() As Date = { #9/16/1993#, #7/28/1994#, #10/16/2000#, _
                              #7/27/2003#, #5/27/2007# }
      For Each dateValue As Date In dates
         Dim interval As TimeSpan = dateValue - birthdate
         ' Get the approximate number of years, without accounting for leap years.
         Dim years As Integer = CInt(interval.TotalDays) \ 365
         ' See if adding the number of years exceeds dateValue.
         Dim output As String
         If birthdate.AddYears(years) <= dateValue Then
            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)   
         End If
      Next
   End Sub
End Module
' 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(IFormatProvider, String, ReadOnlySpan<Object>)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

文字列内の書式指定項目を、指定されたスパン内の対応するオブジェクトの文字列形式に置き換えます。 パラメーターは、カルチャ固有の書式設定情報を提供します。

public:
 static System::String ^ Format(IFormatProvider ^ provider, System::String ^ format, ReadOnlySpan<System::Object ^> args);
public static string Format(IFormatProvider? provider, string format, scoped ReadOnlySpan<object?> args);
static member Format : IFormatProvider * string * ReadOnlySpan<obj> -> string
Public Shared Function Format (provider As IFormatProvider, format As String, args As ReadOnlySpan(Of Object)) As String

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

args
ReadOnlySpan<Object>

書式設定する 0 個以上のオブジェクトを含むオブジェクト スパン。

返品

書式項目が、format内の対応するオブジェクトの文字列形式に置き換えられたargsのコピー。

適用対象

Format<TArg0,TArg1,TArg2>(IFormatProvider, CompositeFormat, TArg0, TArg1, TArg2)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
generic <typename TArg0, typename TArg1, typename TArg2>
 static System::String ^ Format(IFormatProvider ^ provider, System::Text::CompositeFormat ^ format, TArg0 arg0, TArg1 arg1, TArg2 arg2);
public static string Format<TArg0,TArg1,TArg2>(IFormatProvider? provider, System.Text.CompositeFormat format, TArg0 arg0, TArg1 arg1, TArg2 arg2);
static member Format : IFormatProvider * System.Text.CompositeFormat * 'TArg0 * 'TArg1 * 'TArg2 -> string
Public Shared Function Format(Of TArg0, TArg1, TArg2) (provider As IFormatProvider, format As CompositeFormat, arg0 As TArg0, arg1 As TArg1, arg2 As TArg2) As String

型パラメーター

TArg0

書式設定する最初のオブジェクトの型。

TArg1

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

TArg2

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

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

format
CompositeFormat

CompositeFormat です。

arg0
TArg0

書式設定する最初のオブジェクト。

arg1
TArg1

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

arg2
TArg2

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

返品

書式設定された文字列。

例外

formatnullです。

書式指定項目のインデックスは、指定された引数の数以上です。

適用対象

Format<TArg0,TArg1>(IFormatProvider, CompositeFormat, TArg0, TArg1)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
generic <typename TArg0, typename TArg1>
 static System::String ^ Format(IFormatProvider ^ provider, System::Text::CompositeFormat ^ format, TArg0 arg0, TArg1 arg1);
public static string Format<TArg0,TArg1>(IFormatProvider? provider, System.Text.CompositeFormat format, TArg0 arg0, TArg1 arg1);
static member Format : IFormatProvider * System.Text.CompositeFormat * 'TArg0 * 'TArg1 -> string
Public Shared Function Format(Of TArg0, TArg1) (provider As IFormatProvider, format As CompositeFormat, arg0 As TArg0, arg1 As TArg1) As String

型パラメーター

TArg0

書式設定する最初のオブジェクトの型。

TArg1

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

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

format
CompositeFormat

CompositeFormat です。

arg0
TArg0

書式設定する最初のオブジェクト。

arg1
TArg1

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

返品

書式設定された文字列。

例外

formatnullです。

書式指定項目のインデックスは、指定された引数の数以上です。

適用対象

Format<TArg0>(IFormatProvider, CompositeFormat, TArg0)

ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs
ソース:
String.Manipulation.cs

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

public:
generic <typename TArg0>
 static System::String ^ Format(IFormatProvider ^ provider, System::Text::CompositeFormat ^ format, TArg0 arg0);
public static string Format<TArg0>(IFormatProvider? provider, System.Text.CompositeFormat format, TArg0 arg0);
static member Format : IFormatProvider * System.Text.CompositeFormat * 'TArg0 -> string
Public Shared Function Format(Of TArg0) (provider As IFormatProvider, format As CompositeFormat, arg0 As TArg0) As String

型パラメーター

TArg0

書式設定する最初のオブジェクトの型。

パラメーター

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

format
CompositeFormat

CompositeFormat です。

arg0
TArg0

書式設定する最初のオブジェクト。

返品

書式設定された文字列。

例外

formatnullです。

書式指定項目のインデックスは、指定された引数の数以上です。

適用対象