std::format() チートシート

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

C++で、数値を書式指定して文字列に直したいとき、昔ながらの

char buf[256] = { 0 };
sprintf_s(buf, "%d", 123);
printf_s(buf);

という書き方をしていたが、現代(C++20)では、

std::format()

なる便利な標準関数があるらしい。試してみる。

チートシート

下記のページを参考に試してみた。

cpprefjp.github.io

試しに書いたのを、今後の部品どりで並べておく。

#include <iostream>
#include <format>
#include <chrono>

int main()
{
    // そのまんま出力
    std::cout << std::format("{}", 123) << std::endl;

    // スペース6桁
    std::cout << std::format("{:6}", 123) << std::endl;

    // 0を6桁
    std::cout << std::format("{:06}", 123) << std::endl;

    // スペース6桁
    std::cout << std::format("{:6}", "X") << std::endl;

    // 指定文字6桁(今回は*左よせ)
    std::cout << std::format("{:*<6}", "X") << std::endl;

    // 指定文字6桁(今回は*右寄せ)
    std::cout << std::format("{:*>6}", "X") << std::endl;

    // 変数出力
    int a = 10;
    
    // 10進数
    std::cout << std::format("{:6d}", a) << std::endl;

    // 16進数
    std::cout << std::format("{:6x}", a) << std::endl;

    // 16進数(0x を付ける) ※「0x」の分も込みで桁数指定!
    std::cout << std::format("{:#04x}", a) << std::endl; // -> 0x0a

    // 16進数(0x を付けて大文字)
    std::cout << std::format("{:#04X}", a) << std::endl; // -> 0x0A

    // 時刻
    auto now = std::chrono::system_clock::now();

    // 素
    std::cout << std::format("{:%Y/%m/%d %H:%M:%S%n}", now); // 2024/09/12 13:02:38.2312928

    // ミリ秒
    std::cout << std::format("{:%Y/%m/%d %H:%M:%S%n}", std::chrono::floor<std::chrono::milliseconds>(now)); // 2024/09/12 13:02:38

    // 秒
    std::cout << std::format("{:%Y/%m/%d %H:%M:%S%n}", std::chrono::floor<std::chrono::seconds>(now)); // 2024/09/12 13:02:38

    // タイムゾーン考慮(現在のシステムのタイムゾーン)
    //std::chrono::zoned_time nowZoned { std::chrono::current_zone(), now };
    std::cout << std::format("{:%Y/%m/%d %H:%M:%S%n}", std::chrono::zoned_time(std::chrono::current_zone(), now));

    // タイムゾーン考慮(指定のタイムゾーン)
    std::cout << std::format("{:%Y/%m/%d %H:%M:%S%n}", std::chrono::zoned_time(std::chrono::locate_zone("Asia/Tokyo"), now));

    // オールドタイプ
    char buf[256] = { 0 };
    sprintf_s(buf, "%d", 123);
    printf_s(buf);
}

出力

123
   123
000123
X
X*****
*****X
    10
     a
0x0a
0X0A
2025/04/14 12:53:21.6948022
2025/04/14 12:53:21.694
2025/04/14 12:53:21
2025/04/14 21:53:21.6948022
2025/04/14 21:53:21.6948022
123