もくじ
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()
なる便利な標準関数があるらしい。試してみる。
チートシート
下記のページを参考に試してみた。
試しに書いたのを、今後の部品どりで並べておく。
#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