我有一个记录系统,输出记录到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().
我打算回答这个问题.在发布我的答案之前我会给你一些时间,在接受之前再等一等.
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |