C#/.NET에서 문자열을 서식 지정하는 방법에는 크게 두 가지가 있어요. String.Format()을 사용하는 방법과 문자열 보간이에요.
String.Format()은 고정 텍스트와 자리 표시자(문서에서는 _서식 항목_이라고 불러요)로 이루어진 문자열(문서에서는 _복합 서식_이라고 불러요), 그리고 가변 개수의 인자를 받아요. 반환 값은 각 서식 항목을 대응하는 인자로 해석하고, 해석된 값들을 고정 텍스트와 결합해요.
string.Format("I had {0} bitcoins on {1}, the day I forgot my password.", 55.5, new DateTime(2010, 2, 25));
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings
이 방식을 기술적으로는 _복합 서식 지정_이라고 해요.
보간된 문자열은 $가 앞에 붙고, 중괄호로 묶인 런타임 식을 포함해요. 서식 항목의 문법은 $"{<interpolationExpression>}"이에요. 이 방식은 별도의 인자 목록이 필요 없어요. 결과는 String.Format() 방식과 기능적으로 동일해요.
var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf} bitcoins on {thatDay}, the day I forgot my password."
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings
중괄호 안의 텍스트, 즉 복합 서식에서는 자리 표시자, 문자열 보간에서는 보간 식을 _서식 항목_이라고 불러요.
서식 항목은 최대 세 부분으로 이루어질 수 있어요. 첫 번째는 위의 예제 코드에서 볼 수 있듯 필수인 식 또는 인자 자리 표시자예요. 이에 더해 선택 사항인 맞춤(쉼표 ","로 시작해요)과 선택 사항인 서식 문자열(콜론 ":"으로 시작해요)이 있어요.
{<interpolationExpression>[,<alignment>][:<formatString>]}
_맞춤_은 텍스트가 놓이는 "필드"의 길이를 지정하는데, 맞춤이 양수면 왼쪽에, 음수면 오른쪽에 공백을 채워요.
_서식 문자열_은 숫자에 천 단위 구분 기호를 포함할지, 또는 DateTime 객체의 날짜 부분만 출력할지처럼 텍스트 출력의 형태를 지정해요.
다음 코드는 DateTime 객체의 날짜 부분과 실수를 지수 형식으로 표시하는 예를 보여줘요.
var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf:E} bitcoins on {thatDay:d}, the day I forgot my password."
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings
string.Format(
"I had {0:E} bitcoins on {1:d}, the day I forgot my password.",
loadsOf, thatDay)
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings
숫자와 날짜 모두에 대해 표준 서식과 사용자 지정 서식이 있어요. _사용자 지정_과 표준 사이에 중요한 차이는 없는데, 다만 서식 문자를 조합해 사용자 지정 서식 문자열을 만들 수 있다는 점이 달라요.
각 스레드에는 CultureInfo 인스턴스에 캡슐화된 기본 문화권 Thread.CurrentThread.CurrentCulture가 있어요. 스레드의 문화권은 영국식 날짜 형식 _DD/MM/YYYY_와 미국식 _MM/DD/YYYY_의 차이처럼 지역적 차이에 따라 날짜와 숫자를 어떻게 서식 지정할지 결정해요.
CultureInfo는 IFormatProvider 인터페이스를 구현하고 있어요. 이 인터페이스는 String.Format()의 특정 오버로드에 전달할 수 있으며, 스레드 문화권을 재정의하는 데 사용할 수 있어요.
축자 문자열을 사용하면 여러 줄로 된 문자열을 만들 수 있어요. 축자 문자열은 @ 기호로 시작해요.
string str = @"
See no wretched
quotes everywhere
";
이 연습 문제에서는 고등학교 커플이 소셜 미디어에서 사랑을 고백할 수 있도록 도와봐요.
두 이름을 받아 하트로 구분해 표시하는 정적 HighSchoolSweethearts.DisplaySingleLine() 메서드를 구현해 보세요.
서식이 적용된 텍스트는 61자 너비여야 하고, 하트는 문자열의 가운데에 있어야 해요.
어떤 이름이든 줄 너비 안에 넉넉히 들어간다고 보장돼요.
HighSchoolSweethearts.DisplaySingleLine("Lance Green", "Pat Riley");
// => " Lance Green ♡ Pat Riley "
두 사람의 이니셜을 플러스 기호로 구분해 표시하는 정적 HighSchoolSweethearts.DisplayBanner() 메서드를 구현해요.
HighSchoolSweethearts.DisplayBanner("L. G.", "P. R.");
// see the ascii art below
****** ******
** ** ** **
** ** ** **
** * **
** **
** L. G. + P. R. **
** **
** **
** **
** **
** **
** **
***
*
독일에서 온 교환학생들을 위해 교제 시작일과 교제 기간을 보여주는 정적 HighSchoolSweethearts.DisplayGermanExchangeStudents() 메서드를 구현해요.
HighSchoolSweethearts.DisplayGermanExchangeStudents("Norbert", "Heidi", new DateTime(2019, 1, 22), 1535.22f);
// => "Norbert and Heidi have been dating since 22.01.2019 - that's 1.535,22 hours"
Exercism에 가입하고 C# 트랙을 개념 62개연습 문제 178개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.