이 자습서에서는 문자열 보간 을 사용하여 결과 문자열에 식 결과의 서식을 지정하고 포함하는 방법을 보여줍니다. 이 예제에서는 기본 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 메서드 사용하는 것보다 더 읽기 쉬운 대안이 됩니다. 모든 보간된 문자열은 다음 사항을 포함해야 합니다.
- 여는 따옴표 문자 앞의
$
문자로 시작하는 문자열 리터럴입니다. 기호와 따옴표 문자 사이에$
는 공백이 있을 수 없습니다. - 하나 이상의 보간 식입니다. 여는 중괄호(
{
)와 닫는 중괄호(}
)를 사용하여 보간 식을 표시합니다. 중괄호 안에 값(포함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.
자세한 내용은 복합 서식 문서의문자열 구성 요소 서식 섹션을 참조하세요.
서식이 지정된 보간 식의 필드 너비 및 맞춤을 제어하는 방법
형식화된 표현 결과의 최소 필드 너비와 정렬을 지정하려면 보간 식 뒤에 쉼표(",")와 상수 식을 추가하십시오.
{<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 |
너비 값이 양수이면 서식이 지정된 식 결과가 오른쪽에 맞춰집니다. 음수이면 왼쪽 맞춤입니다.
-
너비 지정자 앞에 있는 기호를 제거하고 샘플을 다시 실행하여 결과를 확인합니다.
너비와 서식 문자열을 모두 지정해야 하는 경우 너비 구성 요소로 시작합니다.
{<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 구성 요소 섹션을 참조하세요.
보간된 문자열에서 이스케이프 시퀀스를 사용하는 방법
보간된 문자열은 일반 문자열 리터럴에서 사용할 수 있는 모든 이스케이프 시퀀스를 지원합니다. 자세한 내용은 문자열 이스케이프 시퀀스를 참조하세요.
이스케이프 시퀀스를 문자 그대로 해석하려면 있는 그대로 문자열 리터럴을 사용합니다. 보간된 축자 문자열은 $
및 @
문자로 시작합니다.
$
와 @
은 어떤 순서로든 사용할 수 있으며, $@"..."
와 @$"..."
모두 유효한 보간된 축자 문자열입니다.
결과 문자열에 중괄호 "{" 또는 "}"를 포함하려면 두 개의 중괄호인 "{{" 또는 "}}"을 사용합니다. 자세한 내용은 복합 서식 문서의이스케이프 중괄호 섹션을 참조하세요.
다음 예제에서는 결과 문자열에 중괄호를 포함하고 글자 그대로 해석하는 보간 문자열을 생성하는 방법을 보여 줍니다.
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부터 보간된 원시 문자열 리터럴을 사용할 수 있습니다.
보간 식에서 3항 조건 연산 ?:
자를 사용하는 방법
콜론(":")은 보간 식이 있는 항목에서 특별한 의미를 가지므로 다음 예제와 같이 식에서 조건부 연산 자를 사용하려면 괄호로 묶습니다.
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 인스턴스를 사용하여 다양한 문화권에 대해 여러 결과 문자열을 생성할 수 있습니다.
고정 문화권을 사용하여 결과 문자열을 만드는 방법
.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의 서식 지정 형식 및 복합 서식 지정 문서를 참조하세요.
참고하십시오
.NET