tl;dr;
セキュリティの問題もありc++ではprintfは使いたくない。c++20では、c++ベースの書式フォーマット(std::format)の採用が決まったけど、コンパイラはc++20対応中ということで、過渡期の対応としてfmtlibがおすすめ。ヘッダオンリーで使える。ところが、社内からはなぜか "https://fmt.dev/latest/syntax.html" にアクセスできなくなってしまったので、簡単に調べられるようにここにサンプルコードと結果をあげておくことにした。
浮動小数点サンプルコード
#include "fmt/format.h"
#include <chrono>
#include <fmt/chrono.h>
#include <fmt/time.h>
int main()
{
fmt::print("浮動小数\n");
fmt::print("{}\n",1234.567f); //基本
fmt::print("{:.3f}\n", 1234.567f); //小数部桁指定
fmt::print("{:.4f}\n", 1234.567f); //小数部桁指定
fmt::print("{:0.4f}\n", 1234.567f); //小数部桁指定 0パティング
fmt::print("{:10.3f}\n", 1234.567f); //桁指定
fmt::print("{:>10.3f}\n", 1234.567f);//右寄せ
fmt::print("{:<.3f}\n", 1234.567f); //左寄せ
fmt::print("{:010.3f}\n", 1234.567f);//0パディング
fmt::print("{:10.4f}\n", 1234.567f);
fmt::print("{:6.4f}\n", 1234.567f); //ちなみに指定した桁が不足の場合
fmt::print("{:10.3f}\n", -1234.567f); //桁指定
fmt::print("{:e}\n", 1234.567f);
fmt::print("{:.4e}\n", 1234.567f);
return 1;
}
1234.57
1234.567
1234.5670
1234.5670
1234.567
1234.567
1234.567
001234.567
1234.5670
1234.5670
-1234.567
1.234567e+03
1.2346e+03
以下行のみ。
整数サンプルコード
fmt::print("{}\n",123);
fmt::print("{:4d}\n",123);
fmt::print("{:04d}\n", 123);
fmt::print("{:0{}d}\n", 123,5);
fmt::print("{0:0{1}d}\n", 123, 5);
123
123
0123
00123
00123
文字列サンプルコード
fmt::print("{}\n","abc");
fmt::print("{:s}\n", "abc");
abc
abc
引数順序指定サンプルコード
fmt::print("{}-{}\n", "abc",456);
fmt::print("{0}-{1}\n", "abc", 456);
fmt::print("{1}-{0}\n", "abc", 456);
fmt::print("{0:d}=0x{0:x}\n", 255);
fmt::print("{0:d}=0x{0:X}\n", 255);
abc-456
abc-456
456-abc
255=0xff
255=0xFF
時間表現サンプルコード
//事前にインクルードしておく
#include <chrono>
#include "fmt/format.h"
#include <fmt/chrono.h>
#include <fmt/time.h>
std::chrono::seconds secs(90);
fmt::print("{}\n", secs);
fmt::print("{:%H:%M:%S}\n",secs);
std::chrono::minutes mins(90);
fmt::print("{}\n", mins);
fmt::print("{:%H:%M:%S}\n", mins);
auto sc_now = std::chrono::system_clock::now();
auto tm_now = std::chrono::system_clock::to_time_t(sc_now);//time_t型に変換
fmt::print("{:%Y-%m-%d}\n", *std::localtime(&tm_now));
auto tm_now2 = std::time(nullptr);
fmt::print("{:%H:%I:%S}\n", *std::localtime(&tm_now2));
90s
00:01:30
90m
01:30:00
2019-09-02
18:06:54
履歴
2019/8/24 初版
2019/9/2 時間表現を追加