서식 지정자 (Format Specifier)
C# .NET에는 크게 2개의 Format Specifier가 있다. 일반적으로 많이 사용되는 형식을 표현하는 표준 Format Specifier와 사용자가 임의로 다양하게 형식을 지정할 수 있는 Custom Format Specifier가 그것이다. 일반적인 표준 출력 형식의 문법은 다음과 같다.
{n,w:tp}
여기서 n은 Argument 위치이며 0부터 시작한다. w는 출력 Width를 가리키며, t는 출력 데이타 타입을 그리고 마지막으로 p는 정확도(Precision)을 나타낸다.
예를 들어 아래 예제를 살펴보면, string.Format의 첫번째 파라미터는 Standard Format Specifier를 표현하는 것으로, 첫부분의 0은 Format Specifier다음의 첫번째 파라미터 즉 val을 입력으로 받는다는 뜻이고, 콤마 뒤의 10은 전체 넓이가 10임을 의미하며 따라서 출력변수 s는 앞의 공백을 포함하여 총 10자리를 갖게 된다. 10 다음의 N은 출력이 Numeric 형식으로 출력된다는 것이고, 이 형식은 만약 1000 자리마다 콤마를(Locale에 따라 다름) 표시한다. 마지막 N다음의 2는 소숫점 2자리까지 출력하고 싶다는 것을 나타낸다.
{n,w:tp}
여기서 n은 Argument 위치이며 0부터 시작한다. w는 출력 Width를 가리키며, t는 출력 데이타 타입을 그리고 마지막으로 p는 정확도(Precision)을 나타낸다.
예를 들어 아래 예제를 살펴보면, string.Format의 첫번째 파라미터는 Standard Format Specifier를 표현하는 것으로, 첫부분의 0은 Format Specifier다음의 첫번째 파라미터 즉 val을 입력으로 받는다는 뜻이고, 콤마 뒤의 10은 전체 넓이가 10임을 의미하며 따라서 출력변수 s는 앞의 공백을 포함하여 총 10자리를 갖게 된다. 10 다음의 N은 출력이 Numeric 형식으로 출력된다는 것이고, 이 형식은 만약 1000 자리마다 콤마를(Locale에 따라 다름) 표시한다. 마지막 N다음의 2는 소숫점 2자리까지 출력하고 싶다는 것을 나타낸다.
예제
decimal val = 1234.5678M;
string s = string.Format("{0,10:N2}", val);
// 출력: " 1,234.57"
Console.WriteLine(s);
string s = string.Format("{0,10:N2}", val);
// 출력: " 1,234.57"
Console.WriteLine(s);
숫자: 표준 Format Specifier
자주 사용되는 숫자 형식은 표준 Format Specifier를 사용하여 출력 포맷을 만들 수 있다. 표준 Format 타입으로 N, D, C, X, F, E 등을 사용할 수 있는데, 아래 예제는 이들의 사용 예를 보여주고 있다. 모든 숫자 형식은 컴퓨터에 설정된 기본 Locale 에 따라 다르게 출력될 수 있으므로 주의할 필요가 있다. 아래 예제 중 Currency 타입의 경우 만약 Locale이 English/US로 되어 있는 경우, 기본적으로 소숫점 뒤 2자리 까지 출력한다. 만약 Cents 단위를 없애고 싶으면 0:C0 과 같이 Precision을 0으로 하면 된다.
예제
// N: Number 타입
string.Format("{0:N2}",1234.567); // 1,234.57
// D: Decimal 타입
string.Format("{0:D9}", 12345) // 000012345
// C: Currency 타입
string.Format("{0:C}", 12345); // $12,345.00
string.Format("{0:C0}", 12345); // $12,345
// X: 16진수
string.Format("{0:X}", 1000); // 3E8
// F: Fixed Point
string.Format("{0:F3}", 12345.6); // 12345.600
// E: Scientific
string.Format("{0:E}", 12345.6); // 1.23456E+004
string.Format("{0:N2}",1234.567); // 1,234.57
// D: Decimal 타입
string.Format("{0:D9}", 12345) // 000012345
// C: Currency 타입
string.Format("{0:C}", 12345); // $12,345.00
string.Format("{0:C0}", 12345); // $12,345
// X: 16진수
string.Format("{0:X}", 1000); // 3E8
// F: Fixed Point
string.Format("{0:F3}", 12345.6); // 12345.600
// E: Scientific
string.Format("{0:E}", 12345.6); // 1.23456E+004
숫자: Custom Format Specifier
표준 형식이외에 개발자는 몇개의 심벌을 사용하여 다양하게 숫자 출력 형식을 지정할 수 있다. Custom Format Specifier에서 숫자를 표현하기 위해 사용하는 심벌은 다음과 같다.
# : Digit placeholder (0가 앞에 붙지 않음)
0 : Zero placeholder (0가 앞에 붙음)
. : 소숫점 (Decimal point)
, : 천 자리 (Thousands operator)
; : Section separator
이중 마지막의 Section separator는 다음과 같이 사용한다. Custom Format Specifier에서 Optional로 양수, 음수, 0 에 대해 각각 다른 표현식을 사용할 수 있다. 예를 들어 아래와 같은 코드는 살펴보면, Format Specifier가 2개의 세미콜론으로 구분되어져 3개의 섹션을 만들고 있음을 알 수 있다.
string.Format("{0:#,##0;(#,##0);Zero}", val)
처음 섹션은 양수 포맷을 가리키고, 두번째는 음수 포맷, 그리고 마지막은 값이 0 인 경우의 숫자 포맷을 가리킨다. 즉, 숫자 값이 양수인 경우 천자리가 콤마로 표시되는 형식으로, 숫자가 음수인 경우 마이너스(-) 대신 괄호로 둘러싸인 숫자로 (주로 회계에서 사용함), 그리고 0인 경우 문자열 Zero를 리턴한다.
# : Digit placeholder (0가 앞에 붙지 않음)
0 : Zero placeholder (0가 앞에 붙음)
. : 소숫점 (Decimal point)
, : 천 자리 (Thousands operator)
; : Section separator
이중 마지막의 Section separator는 다음과 같이 사용한다. Custom Format Specifier에서 Optional로 양수, 음수, 0 에 대해 각각 다른 표현식을 사용할 수 있다. 예를 들어 아래와 같은 코드는 살펴보면, Format Specifier가 2개의 세미콜론으로 구분되어져 3개의 섹션을 만들고 있음을 알 수 있다.
string.Format("{0:#,##0;(#,##0);Zero}", val)
처음 섹션은 양수 포맷을 가리키고, 두번째는 음수 포맷, 그리고 마지막은 값이 0 인 경우의 숫자 포맷을 가리킨다. 즉, 숫자 값이 양수인 경우 천자리가 콤마로 표시되는 형식으로, 숫자가 음수인 경우 마이너스(-) 대신 괄호로 둘러싸인 숫자로 (주로 회계에서 사용함), 그리고 0인 경우 문자열 Zero를 리턴한다.
예제
int val = -12345;
s = string.Format("{0:#,##0}", val);
// 출력: -12,345
s = string.Format("{0:#,##0;(#,##0)}", val)
// 출력 : (12,345)
val = 0;
s = string.Format("{0:#,##0;(#,##0);Zero}", val)
// 출력 : Zero
s = string.Format("{0:#,##0}", val);
// 출력: -12,345
s = string.Format("{0:#,##0;(#,##0)}", val)
// 출력 : (12,345)
val = 0;
s = string.Format("{0:#,##0;(#,##0);Zero}", val)
// 출력 : Zero