宽度以适合无符号(自然)数的任何值

Kal*_*ish 4 c++ c++14

背景

我有一个记录系统,输出记录到std::ostream.每个记录都使用一个计数器进行注释,每个输出增加一个,如下所示:

=====  Batch # 5  =====
  This is the fifth record
=====  Batch # 19  =====
  This is the nineteenth record
=====  Batch # 187  =====
  Who knows to spell *that*?
Run Code Online (Sandbox Code Playgroud)

计数器是a std::size_t,即无符号整数.

问题

就像现在一样,输出的数字没有任何填充,看起来很难看.我想实现这个目标:

=====  Batch #     5  =====
  This is the fifth record
=====  Batch #    19  =====
  ...
=====  Batch #   187  =====
=====  Batch # 12345  =====
Run Code Online (Sandbox Code Playgroud)

使流对象处理这个可以实现std::setw.但是,我仍然需要知道有多少位数取最大可能值的基数10表示.

请求

解决方案必须静态地(即在转换时)计算多少位数乘以a的最大可能值的基数10表示std::size_t.我会欢迎任何符合此要求的方法,尽管我更喜欢使用C++ 14(轻松)constexpr的方法.

我试过的提示和事情

似乎在base-B中的自然数N的表示采用与(N的B-索引对数)加1的截断一样多的数字.例如,值100在基数10中是三位数,并且100加1的常用对数为3; 值1234在基数10中是四位数,并且(1234的常用对数)加1的截断是4.在伪事物中:

digits( value , base ) = floor( logarithm( radicand=value , index=base ) ) + 1

我为解释和格式的懒惰道歉; 如果有人知道更好的方法,请随时编辑我的帖子或建议.你可以在这里试试.它似乎有效,但我还没有彻底验证它.

至于std::size_t对象可以容纳的最大值,它是std::numeric_limits<std::size_t>::max().


我打算回答这个问题.在发布我的答案之前我会给你一些时间,在接受之前再等一等.