* 오래된 문서이기는 하나, 잘 정리되어 있기 때문에 번역한번 해보았습니다.
더 추가된 포맷팅에 대해서는 MSDN을 참조하세요!
원문 :
http://blog.stevex.net/string-formatting-in-csharp/
String.Format()함수를 사용하는 .NET 문자열 포맷팅에 관한 빠른 참조(quick reference)를 찾을 수 없어서, 이 문서를 만들었습니다.(이 것 때문에
문자열 포맷팅 FAQ와 이상한 이런
만화까지 만들어졌습니다.)
.NET Framework을 가지고 처음 작업했을때, 한 가지가 저를 당황케 했습니다. sprintf()가 없다는 점입니다. sprintf()는출력버퍼, 포맷팅 문자열과 몇개 인자를 받아서 원하는 형식의 문자열로 만들어 주는 C 함수입니다. 예를 들어
char szError[256];
sprintf(szError, "Error %d occurred. \n", nError);
nError가 12라고 가정한다면, 위 코드는 szError 버퍼에 "Error 12 occurred." 문자열을 쓸것입니다. 이것은 C 프로그래밍의 기본이며 명확하고 사용하기 간단하기 때문에, STL에서 더 좋은 기능을 제공하고 있지만, 대부분의 C++ 프로그래머들이 아직도 이것을 사용하고 있습니다. STL에서 위와 같은 코드는
str << "Error " << nError << " occurred." << endl;
거나, 이와 비슷할 것입니다. 이것은 type-safe이고 sprintf보다 더 객체지향적 이나, 로컬라이즈하거나 코드를 읽기가 쉽지는 않습니다.
.NET Framework은 문자열을 아주 휼륭하게 처리하나, 익숙해지는데 시간이 걸립니다. .NET에서 sprintf와 거의 동등한 기능을 가진 것은 포맷 문자열과 인자를 받아 출력 문자열을 생성하는, 정적 String.Format 함수 입니다. (이것은 출력버퍼에 오버플로우를 발생시키지 않는 다는 점에서 sprintf보다 훨씬 개선된 것입니다.) 예를 들면 위와 비슷한 코드는
string errorString = String.Format("Error {0} occurred.", nError);
입니다. 메타데이터의 능력때문에 .NET 환경에서는 포맷팅할때 데이터타입이 무엇인지 알려주는 문자열을 필요로 하지 않고, 사용하기 원하는 곳에 위치만 시키면 됩니다. (일반적인 sprintf 버그는 잘못된 데이터 타입을 제공하는 것으로, %d대신에 %s를 사용하는것을 막을 수 없으며, 이것은 sprintf가 호출될때 프로그램을 멈추게 할 것이다.)
위 문자열안의 {0}은 nError의 값으로 대체되지만, 이진수로 지정해서 지정해서 사용하려 한다면? 또는 16진수와 같은 것을 사용하려 한다면? Framework은 이러한 모든것들을 지원하지만, 문자 포맷팅을 사용하는 String.Format 함수를 사용하지 않고, 지정된 타입을 사용한다는 것이 혼란스러워 보일 수 도 있습니다.
모든 객체가 문자열을 반활할때 ToString 메소드가 호출됩다. ToString 메소드는 문자열 인자들을 받을 수 있고 - String.Fromat을 호출한 후, "{0:##}"가 같은 포맷팅 문자열들이 위치에 전달된 후 어떻게 포맷팅 될지 알려줍니다.
중괄호 안의 텍스트는 {Index[, alignment][:formatString]} 입니다. 만약 alignment가 양수이면, 텍스트는 오른쪽 정렬되며, 텍스트가 양수보다 작다면 공백이 추가됩니다. 만약 음수라면 왼쪽 정렬됩니다.
문자열
정렬을 제외하고는 문자열에 어떤 포맷팅도 적용되지 않습니다. 정렬의 모든 인자들은 String.Format이 호출될때, 사용되고 표시됩니다.
예시 |
결과 |
String.Format("->{0,10}<-", "Hello"); |
-> Hello<- |
String.Format("->{0,-10}<-", "Hello"); |
->Hello <- |
숫자
기본적인 숫자 포맷팅 지정자입니다.
지정자 |
타입 |
형식 |
결과(1.42일 경우) |
결과(-12400일 경우) |
c |
통화 |
{0:c} |
$1.42 |
-\12,400 |
d |
10진수 |
{0:d} |
System.FormatException |
-12400 |
e |
지수 |
{0:e} |
1.420000e+000 |
-1.240000e+004 |
f |
고정소수점 |
{0:f} |
1.42 |
-12400.00 |
g |
일반 |
{0:g} |
1.42 |
-12400 |
n |
천단위로 ","로 구분
되는 숫자 |
{0:n} |
1.42 |
-12,400 |
r |
라운드트립 |
{0:r} |
1.42 |
System.FormatException |
x |
16진수 |
{0:x4} |
System.FormatException |
cf90 |
* 라운드트립 :
이 형식은 Single 및 Double 형식에만 사용할 수 있습니다. 라운드트립 지정자는 문자열로 변환된 숫자 값이 같은 숫자 값으로 다시 구문 분석될 수 있도록 보장해 줍니다. 이 지정자를 사용하여 숫자 값 형식을 지정하면 Double에는15자리의 전체 자릿수를, Single에는 7자리의 전체 자릿수를 가진 일반 형식을 사용하여 숫자 값을 먼저 테스트합니다. 이 값이 같은 숫자 값으로 다시 구문 분석되면 일반 형식 지정자를 통해 형식이 지정됩니다. 그러나 이 값이 같은 숫자 값으로 다시 구문 분석되지 못하면, Double에는 17자리 전체 자릿수를, Single에는 9자리 전체 자릿수를 사용하여 이 값의 형식이 지정됩니다.전체 자릿수 지정자가 있더라도 무시됩니다. 이 지정자를 사용할 때는 라운드트립이 전체 자릿수보다 우선합니다. - MSDN
사용자정의 포맷팅 입니다.
지정자 |
타입 |
예시 |
결과(1500.42일 경우) |
설명 |
0 |
0 자리 표시자 |
{0:00.0000} |
1500.4200 |
지정된 자릿수만큼 0을
추가한다. |
# |
10진수 자리 표시자 |
{0:(#).##} |
(1500).42 |
|
. |
소숫점 |
{0:0.0} |
1500.4 |
|
' |
천자리 구분 기호 |
{0:0,0} |
1,500 |
반드시 두 0사이에 있
어야 한다. |
'. |
숫자 스케일링 |
{0:0,.} |
2 |
1000을 기준으로, 해당
숫자의 스케일을 알려
준다. 예를 들면 1499
는 1이고, 1500은 2이
다. |
% |
비율 |
{0:0%} |
150042% |
100을 곱하고 %기호를
붙인다. |
e |
지수 자리 표시자 |
{0:00e+0} |
15e+2 |
많은 지수표현이 가능
합니다. |
; |
그룹 구분자 |
하단 참조 |
|
|
그룹구분자는 음수값을 괄호로 묶는것이 필요로 하는 통화 값 형식에 유용합니다. 이 통화 형식 예제는 문서의 하단에 있습니다.
날짜
날짜 포맷팅은 시스템의 국가별 설정에 따라 다릅니다. 아래 예는 저의 로컬 로케일 설정에 의한 것입니다.
지정자 |
타입 |
예(System.DateTime.Now일 경우) |
d |
짧은 날짜 |
2009-11-02 |
D |
긴 날짜 |
2009년 11월 2일 월요일 |
t |
짧은 시간 |
오후 4:30 |
T |
긴 시간 |
오후 4:30:06 |
f |
전체 날짜 시간 |
2009년 11월 2일 월요일 오후 4:30 |
F |
긴 전체 날짜 시간 |
2009년 11월 2일 월요일 오후 4:30:06 |
g |
기본 날짜 시간 |
2009-11-02 오후 4:30 |
G |
긴 기본 날짜 시간 |
2009-11-02 오후 4:30:06 |
M |
월 날짜 패턴 |
11월 2일 |
r |
RFC1123 날짜 문자열 |
Mon, 02 Nov 2009 16:30:06 GMT |
s |
정렬가능한 날짜 문자열 |
2009-11-02T16:30:06 |
u |
정렬가능한 유니버셜 날짜 시간 패턴,
로컬타임 |
2009-11-02 16:30:06Z |
U |
정렬가능한 유니버셜 날짜 시간 패턴,
GMT |
2009년 11월 2일 월요일 오전 7:30:06 |
Y |
년 월 패턴 |
2009년 11월 |
사용자 지정 날짜 포맷팅
지정자 |
타입 |
예시 |
결과 |
dd |
일 |
{0:dd} |
02 |
ddd |
요일 |
{0:ddd} |
월 |
dddd |
전체 요일 |
{0:dddd} |
월요일 |
f, ff, ... |
초 유효자릿수 |
{0:fff} |
366 |
gg, ... |
시대 |
{0:gg} |
서기 |
hh |
2자리 시간 |
{0:hh} |
04 |
HH |
2자리 시간, 24시간 형식 |
{0:HH} |
16 |
mm |
00-59 분 |
{0:mm} |
43 |
MM |
01-12 월 |
{0:MM} |
11 |
MMM |
월 약어 |
{0:MMM} |
11 |
MMMM |
월 이름 |
{0:MMMM} |
11월 |
ss |
00-59 초 |
{0:ss} |
47 |
tt |
AM, PM |
{0:tt} |
오후 |
yy |
2자리 년 |
{0:yy} |
09 |
yyyy |
년 |
{0:yyyy} |
2009 |
zz |
2자리 타임존 옵셋 |
{0:zz} |
+09 |
zzz |
타임존 옵셋 |
{0:zzz} |
+09:00 |
: |
구분자 |
{0:hh:mm:ss} |
04:43:47 |
/ |
구분자 |
{0:dd/MM/yyyy} |
02-11-2009 |
열거형
지정자 |
타입 |
g |
열거자 이름을 문자열로 가져올 수 있으면, 문자열로 그렇지
않으면 정수로 보여줍니다. |
f |
열거자 이름을 문자열로 보여줍니다. |
d |
열거자 이름을 정수로 보여줍니다. |
x |
열거자 이름을 8자리의 16진수로 보여줍니다. |
유용한 예제들
String.Format("{0:$#,##0.00; ($#,##0.00); Zero}", value);
이것은 만약 1243.50을 전달하면, "$1,240.00"을 반환할 것입니다. 만약 -값이 전달된다면, 괄호안에 같은 형태의 결과값이 반활될 것입니다.("($1,240.00)") 만약 0이 전달된다면 "Zero"가 반환될 것입니다.
String.Format({0:(###) ###-####}", 8005551212);
이것은 "(800) 555-1212"를 반환할 것입니다.