LoginSignup
6
6

More than 3 years have passed since last update.

書式付き文字列ライブラリ(fmtlib)のサンプルコードと結果

Last updated at Posted at 2019-08-24

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 時間表現を追加

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6