我担心这个问题有一个简单明了的答案.我需要确定项目数量的宽度是多少,这样我就可以使用维持对齐所需的最小前导零数来填充每个项目编号.例如,如果总数<10则不想要前导零,如果它在10到99之间,则不需要1,等等.
一种解决方案是将项目计数转换为字符串,然后计算字符数.呸!有没有更好的办法?
编辑:我不会想到使用常见的对数(我不知道存在这样的事情).所以,对我来说并不明显 - 但绝对简单.
这应该这样做:
int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
int length = (int)Math.Log10(Math.Abs(number)) + 1;
您可能需要考虑负号..
如果带有乘法的语句,则会重复比重复除法更有效的解决方案...例如(其中n是需要数字位数的数字)
unsigned int test = 1; unsigned int digits = 0; while (n >= test) { ++digits; test *= 10; }
如果项目计数有一些合理的上限(例如无符号整数的32位范围),那么更好的方法是与某些静态数组的成员进行比较,例如
// this covers the whole range of 32-bit unsigned values const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; unsigned int digits = 10; while(n < test[digits]) --digits;