Bagikan melalui


Interpolasi string dalam C#

Tutorial ini menunjukkan kepada Anda cara menggunakan interpolasi string untuk memformat dan menyertakan hasil ekspresi dalam string hasil. Contoh mengasumsikan bahwa Anda terbiasa dengan konsep C# dasar dan pemformatan jenis .NET. Untuk informasi selengkapnya tentang jenis pemformatan di .NET, lihat Tipe pemformatan di .NET.

Pendahuluan

Untuk mengidentifikasi string literal sebagai string yang diinterpolasi, tambahkan simbol $. Anda dapat menyematkan ekspresi C# valid yang mengembalikan nilai dalam string terinterpolasi. Dalam contoh berikut, segera setelah ekspresi dievaluasi, hasilnya dikonversi menjadi string dan disertakan dalam string hasil:

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

Seperti yang ditunjukkan contoh, Anda menyertakan ekspresi dalam string terinterpolasi dengan mengapitnya dengan kurung kurawal:

{<interpolationExpression>}

String terinterpolasi mendukung semua kemampuan fitur pemformatan komposit string . Itu membuat mereka menjadi alternatif yang lebih mudah dibaca untuk penggunaan metode String.Format. Setiap string terinterpolasi harus memiliki:

  • String literal yang dimulai dengan karakter $ sebelum karakter tanda kutip pembuka. Tidak boleh ada spasi antara $ simbol dan karakter tanda kutip.
  • Satu atau beberapa ekspresi interpolasi. Anda menunjukkan ekspresi interpolasi dengan kurung kurawal buka dan tutup ({ dan }). Anda dapat menempatkan ekspresi C# apa pun yang mengembalikan nilai (termasuk null) di dalam kurung kurawal.

C# mengevaluasi ekspresi antara { karakter dan } dengan aturan berikut:

  • Jika ekspresi interpolasi mengevaluasi ke null, string kosong ("", atau String.Empty) digunakan.
  • Jika ekspresi interpolasi tidak mengevaluasi ke null, biasanya metode ToString dari jenis hasil dipanggil.

Cara menentukan string format untuk ekspresi interpolasi

Untuk menentukan string format yang didukung oleh jenis hasil ekspresi, ikuti ekspresi interpolasi dengan titik dua (":") dan string format:

{<interpolationExpression>:<formatString>}

Contoh berikut menunjukkan cara menentukan string format standar dan kustom untuk ekspresi yang menghasilkan tanggal dan waktu atau hasil numerik:

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.

Untuk informasi selengkapnya, lihat bagian Komponen String Format dari artikel Pemformatan Komposit.

Cara mengontrol lebar bidang dan perataan ekspresi interpolasi yang diformat

Untuk menentukan lebar bidang minimum dan perataan hasil ekspresi yang diformat, ikuti ekspresi interpolasi dengan koma (",") dan ekspresi konstanta:

{<interpolationExpression>,<width>}

Sampel kode berikut menggunakan lebar bidang minimum untuk membuat output tabular:

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|

Jika nilai lebar positif, ekspresi yang diformat akan rata kanan; jika negatif, akan rata kiri. - Hapus tanda sebelum penentu lebar dan jalankan sampel lagi untuk melihat hasilnya.

Jika Anda perlu menentukan lebar dan string format, mulailah dengan komponen lebar:

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

Contoh berikut menunjukkan cara menentukan lebar dan perataan, dan menggunakan karakter pipa ("|") untuk memisahkan bidang teks:

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|

Seperti yang ditunjukkan oleh contoh output, jika panjang hasil ekspresi yang diformat melebihi lebar bidang yang ditentukan, nilai lebar diabaikan.

Untuk informasi selengkapnya, lihat bagian Komponen lebar dari artikel Pemformatan komposit .

Cara menggunakan urutan escape dalam string terinterpolasi

String terinterpolasi mendukung semua urutan escape yang dapat digunakan dalam literal string biasa. Untuk informasi selengkapnya, lihat Urutan escape string.

Untuk menafsirkan urutan escape secara harfiah, gunakan string verbatim secara harfiah. String verbatim yang diinterpolasi dimulai dengan karakter $ dan karakter @. Anda dapat menggunakan $ dan @ dalam urutan apa pun: keduanya $@"..." dan @$"..." merupakan string verbatim terinterpolasi yang valid.

Untuk menyertakan kurung kurawal, "{" atau "}", dalam string hasil, gunakan dua kurung kurawal, "{{" atau "}}". Untuk informasi selengkapnya, lihat bagian Kurung kurawal pelepasan dari artikel Pemformatan komposit.

Contoh berikut menunjukkan cara menyertakan kurung kurawal dalam string hasil dan membuat string terinterpolasi 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

Anda dapat menggunakan literal string mentah terinterpolasi.

Cara menggunakan operator ?: bersyarat ternary dalam ekspresi interpolasi

Karena titik dua (":") memiliki arti khusus dalam item dengan ekspresi interpolasi, untuk menggunakan operator kondisional dalam ekspresi, sertakan dalam tanda kurung, seperti yang ditunjukkan contoh berikut:

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

Cara membuat string hasil khusus budaya dengan interpolasi string

Secara bawaan, string terinterpolasi menggunakan budaya saat ini yang ditentukan oleh properti CultureInfo.CurrentCulture untuk semua operasi pemformatan.

Dimulai dengan .NET 6, Anda dapat menggunakan String.Create(IFormatProvider, DefaultInterpolatedStringHandler) metode untuk menyelesaikan string terinterpolasi ke string hasil khusus budaya, seperti yang ditunjukkan contoh berikut:

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

Dalam versi .NET sebelumnya, gunakan konversi implisit string terinterpolasi ke System.FormattableString instans dan panggil metodenya ToString(IFormatProvider) untuk membuat string hasil khusus budaya. Contoh berikut ini menunjukkan cara melakukannya:

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

Seperti yang ditunjukkan contohnya, Anda dapat menggunakan satu FormattableString instans untuk menghasilkan beberapa string hasil untuk berbagai budaya.

Cara membuat string hasil menggunakan budaya invarian

Dimulai dengan .NET 6, gunakan String.Create(IFormatProvider, DefaultInterpolatedStringHandler) metode untuk menyelesaikan string terinterpolasi ke string hasil untuk InvariantCulture, seperti yang ditunjukkan contoh berikut:

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

Dalam versi .NET yang lebih lama, bersama dengan FormattableString.ToString(IFormatProvider) metode , Anda dapat menggunakan metode statis FormattableString.Invariant , seperti yang ditunjukkan contoh berikut:

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

Kesimpulan

Tutorial ini menjelaskan skenario umum penggunaan interpolasi string. Untuk informasi selengkapnya tentang interpolasi string, lihat Interpolasi string. Untuk informasi selengkapnya tentang jenis pemformatan di .NET, lihat artikel Pemformatan tipe dalam .NET dan Pemformatan komposit .

Lihat juga