View

300x250

Write( ), WriteLine( ) 메서드에서 format 지정해주기

printf("%d + %d = %d\n", a, b, sum); // a + b = sum 을 출력

C언어에서는 printf 라는 함수에서 출력하려는 값의 format을 지정해준 뒤 문자열 “” 밖에서 파라미터 형식으로 값을 전달해줄 수 있었다. 그래서 함수의 이름도 print+format 인 printf이었다. 사실 C#에서는 + 를 통해 문자열을 쉽게 합쳐서 출력할 수 있었다보니 이런 format 지정을 이용하지 않았다. (굉장한 낭비이긴 하지만, 단순히 백준 문제를 푸는 데 있어서는 크게 영향이 없더라고)

 

그런데 이 Format 지정을 써줘야하는 문제를 만났다.

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
원 문제 : 백준 4344번

실수형 데이터의 소수점 위치를 정해주어서 소수점 아래 3자리까지만 숫자가 출력되게 만들어야 했다. C였다면 %.3f같은 식으로 해결할 수 있는 문제였지만, C#에서는 format 지정을 한번도 써본 적이 없으니 잘 모르겠더라. 그래서 찾아보았다.

 

Write( ), WriteLine( ) 메서드에서 format 지정해주기

복합 형식 지정 - 공식 Docs

기본적으로 Write(), WriteLine() 메서드(이하 Write 메서드)는 인자로 오는 대부분의 값들을 출력할 수 있다. 만약 이를 '+'로 묶어서 출력한다면 하나의 문자열로 알아서 만들어 출력하는 편리한 기능도 갖추고 있다. 우리가 알고싶은 건 이게 아니니 넘어가자.

 

Index 구성요소

먼저, C#에는 형식 지정 없이 값이 들어갈 자리만 지정해주는 방법이 있다.

Console.Write("Prime numbers less than 10: {0}, {1}, {2}, {3}", 2, 3, 5, 7)

여기에서 {0}, {1}, … 은 뒤에 따라오는 인자들의 index 번호를 말한다. {0}은 0번 값, {1}은 1번 값 등의 순이다. 이게 번호를 지정할 수 있다는 점이 장점이 될 수도 있을 것 같더라. 아래와 같이 index 번호를 섞어도 알아서 잘 인식한다.

Console.WriteLine("{0} + {1} + {2} = {0}",  0,  1,  -1);

 

Format 구성요소

Format은 C보다 더 많은 종류를 갖고있다.

  • D, d : 10진수
  • X, x : 16진수
  • F, f : 고정 소수점
  • 0 : 000.00 처럼 표기하면, 0이 있는 자리에 0이 아닌 숫자가 있으면 숫자를 넣고, 숫자가 없거나 0이면 0을 넣어 출력한다.
  • # : ###.## 처럼 표기하면, #이 있는 자리에 숫자가 있으면 숫자를 넣고, 숫자가 없거나 의미없는 0이면 비우고 출력한다.

위와같은 Format을 비롯하여 더 많은 유용한 Format을 지원한다.

  • P, p : 백분율로 변환하여 % 붙여 출력

  • E, e : 지수 표기법으로 출력

  • C, c : 통화($)로 표기하여 출력

  • 날짜를 나타내는 DateTime 형식을 가져올 경우 미리 지정된 여러 양식으로 가공하여 날짜 및 시간 출력

 

Console.WriteLine("{0:D}, {0:F}, {0:F4}, {0:X}",  15);

  결과 : 15, 15.00, 15.0000, F

Console.WriteLine("{0:00.00}, {0:##.##}, {0:P}, {0:P0}",  5.15);

  결과 : 05.15, 5.15, 515.00 %, 515 %

 

위와 같이 { Index : Format } 의 형식으로 원하는 인자와 출력하고싶은 Format을 지정해줄 수 있다.

 

Alignment 구성요소

Alignment는 단순하게 이야기하자면 문자열이 차지하는 너비를 이야기한다. 출력하는 문자열의 크기가 얼마나 짧든 최소한 이 만큼의 공간은 확보해주겠다는 뜻이다. 내 기억으로는 C에도 이거랑 비슷한 기능이 있었던걸로 기억한다.

 Console.WriteLine("*{0,10}*\n*{1,10}*\n*{2,10}*",  12345,  123456,  1234567);

이런 코드를 작성해서 돌리면 아래와 같은 결과를 얻을 수 있다.
*     12345*
*    123456*
*   1234567*

 

오른쪽 정렬이 아닌, 왼쪽 정렬은 -를 붙여서 만들어줄 수 있다.

Console.WriteLine("*{0,-10}*\n*{1,-10}*\n*{2,-10}*",  12345,  123456,  1234567);

*12345     *
*123456    *
*1234567   *


Index, Format, Alignment 구성요소를 모두 합친다면 이런 형식으로 Write 메서드에서 값을 가공하여 출력할 수 있다.


{ Index [, Alignment] : Format }

320x100
Share Link
reply
반응형
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31