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 |