프로그래밍/C#

C Style String Formatting vs C# Style String Formatting

Tetrahedrite 2020. 5. 31. 23:34

주의: C의 printf와 C#의 string.Format을 비교하는 글입니다.

특히, Console.WriteLine은 서식 방법이 많이 다릅니다. 유의해서 읽어주세요.

 

0. 기본적인 구조

 

C

char* str = "Hello, World!";
printf("Formatted String: %s", str);
/*
Hello, World!
*/

 

C#

string str = "Hello, World!";
string.Format("Formatted String: {0}", str);
/*
Hello, World!
*/

 

C는 printf 함수 자체에서 formatted string을 print하는 구조이지만, C#은 String의 Format 함수가 포맷팅을 제공한다.

또한 기본적으로 object형으로 캐스팅되어 처리하기때문에, 따로 형식 명시가 필요없다.

하지만 몇몇 경우에는 필요하기도 한데... 자세한 내용은 4번 항목을 참고하자.

 

1. 파라메터 전달

 

C

const char *param1 = "name", *param2 = "David";
int param3 = 30;
printf("His %s is %s. %s is %d years old.", param1, param2, param2, param3);
/*
His name is David. David is 30 years old.
*/

 

C#

string param1 = "name", param2 = "David";
int param3 = 30;
string.Format("His {0} is {1}. {1} is {2:d} years old.", param1, param2, param3);
/*
His name is David. David is 30 years old.
*/

 

C는 파라메터를 한 번 출력하고 다시 전달해야 하는 반면...

C#은 한 번 전달하고 다시 사용할 수 있다. {1} {0}과 같이 순서를 바꾸어서도 사용할 수 있다.

물론 C처럼 여러 번 전달하는 방식도 가능하나, 퍼포먼스적으로 이득될 것은 없어 보인다.

 

또한 C에서는 문자열은 s라는 형식 지정자를 사용하는 반면, C#에서는 문자열에는 따로 형식 지정자가 포함되지 않는다.

그 외에 d는 정수형, f는 실수형인데 자세한 내용은 MSDN 참고. (링크)

 

2. 자릿수 맞추기 (여백)

 

C

const char* str = "TEST";
printf("%10s", str);
/*
      TEST
*/

 

C#

string str = "TEST";
Console.WriteLine(string.Format("{0,10}", str));
/*
      TEST
*/

 

C는 %과 형식 지정자(문자열은 s) 사이에 원하는 만큼의 숫자를 문자열로 기입해주면 되고, (%s > %10s)

C#은 파라메터 지정자에서 콤마(,)를 기입해주고 원하는 만큼의 숫자를 문자열로 기입하면 된다. ({0} > {0,10})

 

3. 0으로 채우기 (패딩)

 

C

int i = 10;
printf("%010d", i);
/*
0000000010
*/

 

C#

int i = 10;
string.Format("{0,10:0000000000}", i);
string.Format("{0,10:D10}", i);
/*
0000000010
0000000010
*/

 

C#은 방법이 두가지인데 둘다 똑같은 방법이긴 하다. 단 아래의 D10에서 D는 생략이 불가능하다.

 

4. 형식 지정자 사용하기 16진수로 출력하기

 

C

int i = 255;
printf("%x", i);
/*
ff
*/

 

C#

int i = 255;
string.Format("{0:x}", i);
/*
ff
*/

 

혹시 X를 대문자로 하면 FF가 된다는 걸 설명이 필요한 사람은 없겠지... 아마도...

 

5. 왼쪽으로 정렬

 

C

int i = 10;
printf("%-10dEND", i);
/*
10        END
*/

 

C#

int i = 10;
string.Format("{0,-10}END", i);
/*
10        END
*/

 

C와 똑같다. 음수 부호를 추가하면 된다.

 

 

응용) int형(4바이트) 정수를 0xFFFFFFFF 형식으로 표현하기

 

C

int i = 38177486;
printf("0x%08X", i);
/*
0x02468ACE
*/

 

C#

int i = 38177486;
string.Format("0x{0:X8}", i);
/*
0x02468ACE
*/