次の方法で共有


C# における文字列補間

このチュートリアルは、文字列補間を使用して結果文字列に式の結果を書式設定したものを含める方法を示しています。 この例では、基本的な C# の概念と .NET 型の書式設定に精通していることを前提としています。 .NET の書式設定の種類の詳細については、「.NET の書式設定の種類」を参照してください。

はじめに

文字列リテラルを挿入文字列として識別するため、先頭に $ の記号を追加してください。 挿入文字列の値を返す、有効な C# の式を埋め込むことができます。 次の例では、式が評価されるとすぐにその結果が文字列に変換され、結果文字列に含まれています。

double a = 3;
double b = 4;
Console.WriteLine($"Area of the right triangle with legs of {a} and {b} is {0.5 * a * b}");
Console.WriteLine($"Length of the hypotenuse of the right triangle with legs of {a} and {b} is {CalculateHypotenuse(a, b)}");
double CalculateHypotenuse(double leg1, double leg2) => Math.Sqrt(leg1 * leg1 + leg2 * leg2);
// Output:
// Area of the right triangle with legs of 3 and 4 is 6
// Length of the hypotenuse of the right triangle with legs of 3 and 4 is 5

例に示すように、式を中かっこで囲むことで挿入文字列に含めることができます。

{<interpolationExpression>}

挿入文字列では、文字列の複合書式設定機能に含まれるすべての機能がサポートされます。 そのため、String.Format メソッドを使用するよりも読みやすい代替手法になります。 挿入されるすべての文字列には、次の情報が必要です。

  • 開始引用符文字の前に $ 文字で始まる文字列リテラル。 $記号と引用符文字の間にスペースを入れることはできません。
  • 1 つ以上の 補間式。 補間式は、開始波括弧 ({) と終了波括弧 (}) を使用して示します。 値 ( nullを含む) を返す任意の C# 式を中かっこ内に配置できます。

C# は、次の規則を使用して、 { 文字と } 文字の間の式を評価します。

  • 補間式が nullと評価された場合は、空の文字列 (""、または String.Empty) が使用されます。
  • 補間式が nullと評価されない場合は、通常、結果の型の ToString メソッドが呼び出されます。

補間式の書式設定文字列を指定する方法

式の結果の型でサポートされる書式指定文字列を指定するには、コロン (":") と書式指定文字列を使用して補間式に従います。

{<interpolationExpression>:<formatString>}

次の例は、日時や数値による結果を生成する式の標準とカスタムの書式設定文字列を指定する方法を示しています。

var date = new DateTime(1731, 11, 25);
Console.WriteLine($"On {date:dddd, MMMM dd, yyyy} L. Euler introduced the letter e to denote {Math.E:F5}.");
// Output:
// On Sunday, November 25, 1731 L. Euler introduced the letter e to denote 2.71828.

詳細については、「複合書式設定」記事の「Format String コンポーネント」を参照してください。

書式設定された補間式のフィールドの幅と配置を制御する方法

コンマ (",") と定数式を持つ補間式に従って、書式設定された式の結果の最小フィールド幅と配置を指定します。

{<interpolationExpression>,<width>}

次のコード サンプルでは、最小フィールド幅を使用して表形式の出力を作成します。

var titles = new Dictionary<string, string>()
{
    ["Doyle, Arthur Conan"] = "Hound of the Baskervilles, The",
    ["London, Jack"] = "Call of the Wild, The",
    ["Shakespeare, William"] = "Tempest, The"
};

Console.WriteLine("Author and Title List");
Console.WriteLine();
Console.WriteLine($"|{"Author",-25}|{"Title",30}|");
foreach (var title in titles)
{
    Console.WriteLine($"|{title.Key,-25}|{title.Value,30}|");
}
// Output:
// Author and Title List
// 
// |Author                   |Title                          |
// |Doyle, Arthur Conan      |Hound of the Baskervilles, The |
// |London, Jack             |         Call of the Wild, The |
// |Shakespeare, William     |                  Tempest, The |

の値が正の値である場合、書式設定された式の結果は右揃えになります。負の値である場合は、左揃えになります。 幅指定子の前の - 記号を削除し、サンプルをもう一度実行して結果を確認します。

幅と書式設定文字列の両方を指定する必要がある場合は、width コンポーネントから開始します。

{<interpolationExpression>,<width>:<formatString>}

次の例は、幅と配置を指定する方法を示し、テキスト フィールドを区切るためにパイプ文字 ("|") を使用しています。

const int NameAlignment = -9;
const int ValueAlignment = 7;
double a = 3;
double b = 4;
Console.WriteLine($"Three classical Pythagorean means of {a} and {b}:");
Console.WriteLine($"|{"Arithmetic",NameAlignment}|{0.5 * (a + b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Geometric",NameAlignment}|{Math.Sqrt(a * b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Harmonic",NameAlignment}|{2 / (1 / a + 1 / b),ValueAlignment:F3}|");
// Output:
// Three classical Pythagorean means of 3 and 4:
// |Arithmetic|  3.500|
// |Geometric|  3.464|
// |Harmonic |  3.429|

出力例が示すように、書式設定された式の結果の長さが指定したフィールドの幅を超える場合、の値は無視されます。

詳細については、「複合書式設定」記事の「Width コンポーネント」セクションを参照してください。

挿入文字列でエスケープ シーケンスを使用する方法

挿入文字列は、通常の文字列リテラルで使用できるすべてのエスケープ シーケンスをサポートします。 詳細については、「文字列のエスケープ シーケンス」を参照してください。

エスケープ シーケンスをリテラルで解釈するには、verbatim 文字列リテラルを使用します。 補間された逐語的文字列は、 $ 文字と @ 文字の両方で始まります。 任意の順番で $ および @ を使用できます。$@"..."@$"..." は、補間逐語文字列で有効です。

中かっこ "{" または "}" を結果文字列に含める場合は、2 つの中かっこ "{{" または "}}" を使用します。 詳細については、「複合書式設定」記事の「中かっこをエスケープする」セクションを参照してください。

次の例は、結果文字列に中かっこを含め、verbatim 挿入文字列を作成する方法を示しています。

var xs = new int[] { 1, 2, 7, 9 };
var ys = new int[] { 7, 9, 12 };
Console.WriteLine($"Find the intersection of the {{{string.Join(", ",xs)}}} and {{{string.Join(", ",ys)}}} sets.");
// Output:
// Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.

var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var verbatimInterpolated = $@"C:\Users\{userName}\Documents";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(verbatimInterpolated);
// Output:
// C:\Users\Jane\Documents
// C:\Users\Jane\Documents

C# 11 から始まる 補間生文字列リテラルを使用できます。

補間式で三項条件演算子 ?: を使用する方法

コロン (":") が補間式の項目で特別な意味を持つときに、式で条件演算子を使用するには、次の例が示すようにその式をかっこで囲みます。

var rand = new Random();
for (int i = 0; i < 7; i++)
{
    Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}

文字列補間を使用してカルチャ固有の結果文字列を作成する方法

既定では、挿入文字列は、すべての書式設定操作に対して CultureInfo.CurrentCulture プロパティで定義された現在のカルチャを使用します。

次の例に示すように、.NET 6 以降では、String.Create(IFormatProvider, DefaultInterpolatedStringHandler) メソッドを使用して、補間文字列をカルチャ固有の結果文字列に解決できます。

var cultures = new System.Globalization.CultureInfo[]
{
    System.Globalization.CultureInfo.GetCultureInfo("en-US"),
    System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
    System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
    System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
var number = 31_415_926.536;
foreach (var culture in cultures)
{
    var cultureSpecificMessage = string.Create(culture, $"{date,23}{number,20:N3}");
    Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:
// en-US       8/27/2023 12:35:31 PM      31,415,926.536
// en-GB         27/08/2023 12:35:31      31,415,926.536
// nl-NL         27-08-2023 12:35:31      31.415.926,536
//               08/27/2023 12:35:31      31,415,926.536

.NET の以前のバージョンで、カルチャ固有の結果文字列を作成するには、System.FormattableString インスタンスへの補間文字列の暗黙的変換を使用し、その ToString(IFormatProvider) メソッドを呼び出します。 その方法を次の例に示します。

var cultures = new System.Globalization.CultureInfo[]
{
    System.Globalization.CultureInfo.GetCultureInfo("en-US"),
    System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
    System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
    System.Globalization.CultureInfo.InvariantCulture
};
var date = DateTime.Now;
var number = 31_415_926.536;
FormattableString message = $"{date,23}{number,20:N3}";
foreach (var culture in cultures)
{
    var cultureSpecificMessage = message.ToString(culture);
    Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}
// Output is similar to:
// en-US       8/27/2023 12:35:31 PM      31,415,926.536
// en-GB         27/08/2023 12:35:31      31,415,926.536
// nl-NL         27-08-2023 12:35:31      31.415.926,536
//               08/27/2023 12:35:31      31,415,926.536

例に示すように、FormattableString インスタンスを 1 回使用して、さまざまなカルチャに対する複数の結果文字列を生成することができます。

インバリアント カルチャを使用して結果文字列を作成する方法

次の例に示すように、.NET 6 以降では、String.Create(IFormatProvider, DefaultInterpolatedStringHandler) を使用して、補間文字列をInvariantCulture の結果文字列に解決します。

string message = string.Create(CultureInfo.InvariantCulture, $"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:
// Date and time in invariant culture: 05/17/2018 15:46:24

次の例に示すように、.NET の以前のバージョンでは、FormattableString.ToString(IFormatProvider) メソッドと、静的 FormattableString.Invariant メソッドを併用できます。

string message = FormattableString.Invariant($"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(message);
// Output is similar to:
// Date and time in invariant culture: 05/17/2018 15:46:24

結論

このチュートリアルでは、文字列補間の使用に関する一般的なシナリオについて説明しています。 文字列補間の詳細については、「文字列補間」を参照してください。 .NET の型の書式設定の詳細については、「.NET での型の書式設定」および「複合書式設定」記事を参照してください。

こちらもご覧ください