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

背景

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

=====  Batch # 5  =====
  This is the fifth record
=====  Batch # 19  =====
  This is the nineteenth record
=====  Batch # 187  =====
  Who knows to spell *that*?

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

问题

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

=====  Batch #     5  =====
  This is the fifth record
=====  Batch #    19  =====
  ...
=====  Batch #   187  =====
=====  Batch # 12345  =====

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

请求

解决方案必须静态地(即,在转换时)计算std :: size_t的最大可能值的基数10表示的位数.我会欢迎任何满足这一要求的方法,尽管我更喜欢那些使用C 14(放松)constexprs的方法.

我试过的提示和事情

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

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

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

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

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

似乎 std::numeric_limits::digits10就是你想要的.
live example
相关文章
相关标签/搜索