[C#] 포맷 텍스트(Format Text) 소개 (string.Format, ToString, $ 문자열 보간법)
우리는 일반적으로 다음과 같이 문자열을 사용한다.
"Hello, World!"
하지만 만약에, World 대신에 유저의 이름을 넣고 싶다거나,
Hello 대신에 Good Bye를 넣고 싶다거나 하는 경우에는 어떻게 해야 할까?
이런 식으로 문자열을 하나의 고정된 값으로 설정하지 않고 다양한 변수에 대응할 수 있게끔 도와주는 문법이 '포맷 텍스트(Format Text)' 이다.
오늘은 포맷 텍스트를 사용하는 방법을 살펴볼 것이다.
포맷 텍스트를 사용하는 3가지 방법인 string.Format, $문자열 보간법, ToString 각각의 문법에 대한 설명과,
포맷을 설정하는 2가지 방법인 사용자 포맷 지정자, 표준 포맷 지정자에 대해 정리할 예정이다.
1. 포맷 텍스트 메서드
1.1. string.Format()
Debug.Log(string.Format("Hello, {0}!", "철수"));
// 출력: Hello, 철수!
포맷 텍스트의 기본이라고 하면 나는 이런 형식이 가장 떠오른다.
string.Format을 사용하면, {0}, {1}, {2}, ... 와 같은 형식으로 자리를 지정할 수 있고, 이후 파라미터로 순차적으로 값을 넣어 사용할 수 있다.
다만 문장과 문장에 들어가는 내용이 분리되어 있기 때문에 사고를 한 번 더 거쳐야 한다는 단점이 있다.
특히 순서를 개인이 매칭해서 확인해야 하기 때문에 번거로운 느낌이 있다.
1.2. $문자열 보간법
string name = "철수";
Debug.Log($"Hello, {name}!");
// 출력: Hello, 철수!
가장 최신의 권장되는 포맷 텍스트 형식이다.
어떤 자리에 뭐가 들어가야 하는지 단순한 형식으로 확인할 수 있는 것이 최대 장점이다.
중괄호 내에 연산(예를 들어, {a+b})을 넣을 경우 연산을 수행한 결과값을 해당 자리에 출력하므로 각종 상황에서 유리하게 사용할 수 있을 것이다.
1.3. value.ToString()
int value = 10000;
Debug.Log(value.ToString("N0"));
// 출력: 10,000
ToString() 함수는 앞서 소개한 두 포맷 텍스트 형식과는 약간 차이가 있는데,
지정된 변수를 문자열로 형 변환하여 특정한 형식을 따르도록 하는 방식으로 작동한다.
따라서 쓰임새가 약간 다르다고 할 수 있다.
간단한 로그를 찍거나 문장을 구성하는 등에는 string.Format() 이나 $문자열 보간을 사용하는 게 좋고,
변수를 문자열로 형 변환할 때, 특히 숫자를 특정 형식으로 맞추고 싶다거나 할 때에는 value.ToString() 을 사용하면 된다.
ToString 함수 내에는 포맷 지정자를 지정해야 하는데 이 부분은 아래의 [2. 포맷 지정자] 파트에서 구체적으로 살펴보도록 하겠다.
1.4. 포맷 텍스트 메서드 비교
특징 | string.Format() | $문자열 보간 | value.ToString() |
문법 | string.Format("Hello, {0}!", "철수") | $("Hello, {name}!") | value.ToString("N0") |
포맷 내 연산, 함수 호출 지원 여부 | 불가능 | 가능 보다 유연한 처리 가능 |
불가능 |
가독성 | 인덱스 기반으로 가독성 낮음 | 변수를 직접 사용해서 직관적 | 타겟이 명확하고 간결함 |
값 개수 | 여러 값 포맷팅에 적합 | 여러 값 포맷팅에 적합 (복잡한 문자열도 간결하게 처리 가능) |
값 1개에 적합 (string이 아닌 변수를 형 변환하는 방식) |
이러나 저러나 최신식 문법인 $문자열 보간이 가장 좋아 보인다.
성능 면에서도 상대적으로 우위에 있다고 한다.
2. 포맷 지정자
2.1. 사용자 포맷 지정자
사용자 포맷 지정자는 숫자 데이터를 세밀하게 제어할 수 있도록 직접 정의하는 방식이다.
이를 통해 개발자가 원하는 자리수와 형식을 상세히 정의할 수 있는 것이 가장 큰 장점이다.
사용자 포맷 지정자에는 0과 #이 있는데, 예제와 함께 둘 사이의 차이를 설명해보겠다.
1) 0 (Zero Placeholder)
double value = 42.5
Debug.Log(value.ToString("00")); //결과: "42"
Debug.Log(value.ToString("0000")); //결과: "0042"
Debug.Log(value.ToString("00.00")); //결과: "42.50"
위의 로깅에서 알 수 있듯이 0을 작성하면 자리에 해당하는 숫자가 없는 빈 공간에 0을 써서 자리를 채우게 된다.
자릿수를 강제로 맞출 때 사용할 수 있다.
2) # (Digit Placeholder)
double value = 42.5;
Debug.Log(value.ToString("##")); //결과: "42"
Debug.Log(value.ToString("####")); //결과: "42"
Debug.Log(value.ToString("##.##")); //결과: "42.5"
반면 0과 달리 #은 숫자가 없는 경우 아무것도 출력하지 않는다.
필요한 자리만 출력되고, 불필요한 0은 제거된다.
아래와 같이 0과 #을 섞어서 쓸 수도 있으니 참고하자.
double value = 42.5;
Debug.Log(value.ToString("#.00")); //결과: "42.50"
Debug.Log(value.ToString("00.#")); //결과: "42.5"
Debug.Log(value.ToString("00##.#")); //결과: "0042.5"
2.2. 표준 포맷 지정자
표준 포맷 지정자는 미리 정의된 간단한 문자로 특정 형식을 적용하는 것을 말한다.
간결하게 사용할 수 있으므로 코드 가독성이 높고, 포맷 지정자 뒤에 숫자(정밀도)를 추가하여 세부 설정도 가능하다.
- 정밀도는 지정자 뒤에 숫자를 붙여주는 방식으로 지정할 수 있다. (ex. 지정자 N일 때 N2 입력 시 소수점 둘째 자리까지)
주로 사용되는 형식들(숫자, 통화, 백분율 등)을 쉽게 적용할 수 있는 것이 장점이다.
표준 포맷 지정자 옵션
지정자 | 의미 | 예제 |
D | 정수 출력 (Decimal) | 123.ToString("D5") → "00123" |
F | 고정 소수점 형식 (Fixed-point) | 123.45.ToString("F2") → "123.45" |
N | 천 단위 구분 기호 추가 (Number) | 1234.56.ToString("N1") → "1,234.6" - 이렇게 자리수가 한정될 때에는 삭제된 자리수에 대해 반올림 처리가 이루어진다. |
C | 통화 형식 (Currency) | 1234.ToString("C") → "₩1,234.00" - 두 번째 파라미터로 CultureInfo 클래스를 넘기면 다른 문화의 통화 기호를 사용해 표현할 수 있다. 환율 등 자동 치환은 되지 않는다. (* System.Globalization 사용이 필요하다.) 12345.67.ToString("C", CultureInfo.GetCultureInfo("en-US")); → $12,345.67 |
P | 백분율 형식 (Percentage) | 0.85.ToString("P1") → "85.0%" |