format(C++20)

1. std::format

format_01.cpp

// g++ format_01.cpp -std=c++20
#include <iostream>
#include <string>
#include <format>

void test_01() {
    // 使用字符串填充
    std::cout << std::format("Hello {}!\n", "World");  // Hello World!

    // 提供的参数可以比placeholder多
    std::cout << std::format("Hello {}!\n", "World", 1, 2, 3);  // Hello World!

    // 可以通过占位符调整输出的顺序
    std::cout << std::format("{0} {1} {2} {3}\n", "Wang", "Zai", "Niu", "Nai");  // Wang Zai Niu Nai
    std::cout << std::format("{3} {2} {0} {1}\n", "Wang", "Zai", "Niu", "Nai");  // Nai Niu Wang Zai

    std::cout << std::format("{0} ", "Hao", "Yu", "Zhi", "Shi", "Jie");  // Hao
    std::cout << std::format("{1} ", "Hao", "Yu", "Zhi", "Shi", "Jie");  // Yu
    std::cout << std::format("{2} ", "Hao", "Yu", "Zhi", "Shi", "Jie");  // Zhi
    std::cout << std::format("{3} ", "Hao", "Yu", "Zhi", "Shi", "Jie");  // Shi
    std::cout << std::format("{4}\n", "Hao", "Yu", "Zhi", "Shi", "Jie");  // Jie

    // 使用整数填充
    int a = 1, b = 2;
    int c = a + b;
    std::cout << std::format("{} + {} = {}\n", a, b, c);  // 1 + 2 = 3

    // 使用浮点数填充
    double d = 1.2, e = 3.5;
    double f = d + e;
    std::cout << std::format("{0} + {1} = {2}\n", d, e, f);  // 1.2 + 3.5 = 4.7
}

int main() {
    test_01();
}

format_02.cpp

// g++ format_02.cpp -std=c++20
#include <iostream>
#include <string>
#include <format>

void test_02(){
    /* {[arg_id][!spec][:[fill]align][sign][#][0][width][.precision][type]} */
    // 冒号前面的2表示占位符arg_id,输出第二个参数;
    // “:*^+100”中,^是fill表示居中对齐,20是align表示填充宽度,*是填充字符,+表示加法符号
    std::cout << std::format("{2:*^+20}\n", 56, 24, 36);   // ********+36*********
    // 填充宽度也可以用占位符、参数对来表示,如下面的3表示使用占位符的第三个参数作为填充宽度
    std::cout << std::format("{2:*^+{3}}\n", 56, 24, 36, 20);   // ********+36*********

    // 左右对齐
    std::cout << std::format("{0:}: {2:*<20}\n", "left-align", "right-align", -36);   // left-align: -36*****************
    std::cout << std::format("{1:}: {2:0>20}\n", "left-align", "right-align", 36);  // right-align: 00000000000000000036

    // 十六进制、十进制、八进制、二进制
    std::cout << std::format("{0:}: {4:^10X}\n", "HEX", "DEC", "OCT", "BIN", 15);   // HEX:     F 
    std::cout << std::format("{0:}: {4:^#10X}\n", "HEX", "DEC", "OCT", "BIN", 15);  // HEX:    0XF 
    std::cout << std::format("{0:}: {4:^#10x}\n", "HEX", "DEC", "OCT", "BIN", 15);  // HEX:    0xf 
    std::cout << std::format("{3:}: {4:^#10B}\n", "HEX", "DEC", "OCT", "BIN", 15);  // BIN:   0B1111
    std::cout << std::format("{3:}: {4:^#10b}\n", "HEX", "DEC", "OCT", "BIN", 15);  // BIN:   0b1111 
    std::cout << std::format("{2:}: {4:^#10o}\n", "HEX", "DEC", "OCT", "BIN", 15);  // OCT:    017
    std::cout << std::format("{1:}: {4:^#10}\n", "HEX", "DEC", "OCT", "BIN", 15);   // DEC:     15

    // 精度
    double val = 3.14159265358 / 1.3;
    std::cout << std::format("{0:*^20.12}\n", val);   // ***2.41660973352****
    std::cout << std::format("{0:*^20.12f}\n", val);  // ***2.41660973352****
    std::cout << std::format("{0:.12g}\n", val);      // g是默认格式,2.41660973352
    std::cout << std::format("{0:.12e}\n", val);      // 2.416609733523e+00
    std::cout << std::format("{0:.12E}\n", val);      // 2.416609733523E+00
    std::cout << std::format("{0:.12a}\n", val);      // 1.355377be56a4p+1
    std::cout << std::format("{0:.12A}\n", val);      // 1.355377BE56A4P+1

    int width = 20, precision = 12;  // 总共20位,精度(小数位)占12位
    std::cout << std::format("{0:=^{1}.{2}E}\n", val, width, precision);  // =2.416609733523E+00=
}

int main() {
    test_02();
}

2. std::format_tostd::format_to_nstd::formatted_size

format_03.cpp

#include <string>
#include <iostream>
#include <format>
#include <vector>

void test_03(){
    double pi = 3.14159265358979;
    char content[50] = {'\0'};
    sprintf(content, "%f", pi);
    printf("%s\n", content);   // 3.141593

    std::cout << std::format("{}\n", pi);
    std::format_to_n(content, sizeof(content), "{}", pi);
    std::cout << content << std::endl;  // 3.14159265358979

    std::vector<char> vec1;
    std::format_to(std::back_inserter(vec1), "{}", pi);  // 3.14159265358979
    for(const auto&it: vec1){ std::cout << it;}
    std::cout << std::endl;
    
    // 计算格式化字符串需要的空间
    auto size = std::formatted_size("{}", pi);
    std::vector<char> vec2(size); 
    std::format_to(vec2.data(), "{}", pi);  // 3.14159265358979
    for(const auto&it: vec2){ std::cout << it; }
    std::cout << std::endl;
}

int main() {
    test_03();
}
上一篇:3.25C++


下一篇:智能楼宇3D可视化解决方案