C++ 20 : Format

RuuNee
|2024. 6. 30. 17:39
반응형

format string

서버 쪽 로그 시스템에서 응용 가능

 

주요 함수 3가지

format : 포맷 스트링 반환
format_to : 결과를 output iterator에 반환
format_to_n : 최대 n개의 문자를 output iterator에 반환

 

	int value = 20;
	cout << format("Hello C++{}", value) << endl;

	string buffer;
	format_to(std::back_inserter(buffer), "Hello C++{}", value);
	cout << buffer << endl;

	string buffer2;
	format_to_n(std::back_inserter(buffer2),5, "Hello C++{}", value);
	cout << buffer2 << endl;

 

 


 

진짜로 '{'를 사용하고 싶다면 '{{' 이런식으로 두개를 사용하면 됨.

 

cout << format("{{Hello C++{}}}", value) << endl;

 

 


 

순서 지정 가능

 

cout << format("{} {} {}", 10,20,30) << endl;
cout << format("{2} {0} {1}", 10,20,30) << endl;

 

 


Fill Character(빈칸 채우는 문자 지정 가능. 기본값은 space)
Alignment
:10 : 10칸만큼 빈칸을 채움.
< : left (숫자가 아니라면 얘가 default)
> : right (숫자라면 얘가 default)
^ : center 

 

int num = 100;
cout << format("{:10}", num) << endl;
cout << format("{:10}", 'x') << endl;

//*로 빈칸을 채움
cout << format("{:*<10}", 'x') << endl;
cout << format("{:*>10}", 'x') << endl;
cout << format("{:*^10}", 'x') << endl;

 

 


[부호]
정수나 부동소수점에 사용
+ (양수면 + 붙여라)
- (음수면 - 붙여라) << default

 

cout << format("{0:},{0:+},{0:-},{0: }", 0) << endl;
cout << format("{0:},{0:+},{0:-},{0: }", 1) << endl;
cout << format("{0:},{0:+},{0:-},{0: }", -1) << endl;

 

 

 


[#]
정수에 대해, 0b, 0, 0x 2진수, 8진수, 16진수
#015 : pads with leading zeros

 

cout << format("{:#015}", 0x78) << endl;
cout << format("{:#015b}", 0x78) << endl;
cout << format("{:#015x}", 0x78) << endl;

 

 


[width / precision]
width : {:n} n은 minimum width
precision : .에다가 양수 조합 (string이라면 문자개수, float라면 formatting precision)

 

int i = 123456789;
double d = 123.456789;

cout << "----" << format("{}", i) << "----" << endl;
cout << "----" << format("{:15}", i) << "----" << endl; //w=15
cout << "----" << format("{}", d) << "----" << endl;
cout << "----" << format("{:15}", d) << "----" << endl << endl; //w=15

cout << "----" << format("{:.50}", d) << "----" << endl; //p=50
cout << "----" << format("{:.8}", d) << "----" << endl;
cout << "----" << format("{:.5}", d) << "----" << endl;
cout << "----" << format("{:.5}", "Hello World") << "----" << endl;

 

 

 


[Type]
대부분 컴파일러가 알아서 어떤 타입인지 추론해줌.
우리가 직접 지정할 수도 있다!
s : string
b : binary
B : b와 같지만 0B로 시작
d : decimal
o : octal
x : hexadecimal
X : x와 같지만 OX로 시작
부동소수점 관련 (e, E, f, F, g, G) : 생략(지수 표시, 정밀도 등)

 

cout << format("{:}", num) << endl;
cout << format("{:d}", num) << endl;
cout << format("{:b}", num) << endl;
cout << format("{:o}", num) << endl;
cout << format("{:x}", num) << endl;

 

 


[User Defined Types]
std::formatter 클래스를 신규 타입에 대해 특수화
-멤버 함수 parse, format을 구현해야 함.

 

struct vec2
{
	int x;
	int y;
};

template<>
struct std::formatter<vec2>
{
	auto parse(auto& context)
	{
		return context.end();
	}

	auto format(const vec2& v, auto context)
	{
		return std::format_to(context.out(), "({},{})", v.x, v.y);
	}
};

void main()
{
    auto s = std::format("{}", vec2{ 18, 125 });
    cout << s << endl;
}

 

반응형

'C++' 카테고리의 다른 글

C++ 20 : TimeZone  (0) 2024.06.24
C++ 20 : Calendar  (0) 2024.06.04
C++ 20 : 비트 연산  (0) 2024.06.04
C++ 20 : Arithmetic(산술)  (0) 2024.05.31
C++ 20 : Container(2)  (0) 2024.05.30