获取两个数字的位数差异

3
为了一个简单的命令行工具,我想绘制一个简单的图表,显示一些点和它们的y轴值。对于y轴标签,我想打印当前“行”的级别,如下所示:
55,09|  |
54,90|  ||
54,70|  ||
54,51|  ||
54,32|  ||
54,13|  ||
53,94|  ||
53,75|  ||
53,56|  ||
53,37|  |||
53,18|  |||                   |    |
52,99|  |||            |     ||    |
52,80|  |||         |  |     ||    |
52,61|  |||         || |     |||   |
52,42| ||||||       || |  |  ||||  ||
52,23| ||||||       ||||  |  ||||  ||
52,04| ||||||       ||||  |  |||| |||
51,85| ||||||       ||||  |  |||| |||
51,66| ||||||       |||| ||| |||| |||
51,47| ||||||      ||||||||| ||||||||
51,28| ||||||      ||||||||||||||||||
51,09| ||||||      ||||||||||||||||||
50,90| ||||||     |||||||||||||||||||
50,71| ||||||     |||||||||||||||||||
50,52| |||||||    |||||||||||||||||||
50,33| |||||||    |||||||||||||||||||
50,14| |||||||  |||||||||||||||||||||
49,95| |||||||  |||||||||||||||||||||
49,76| |||||||| |||||||||||||||||||||
49,28| ||||||||||||||||||||||||||||||

但是有时最大值可能比最小值具有更多的数字:

1000,00| |
666,67| | |
333,33| |||
0,01|||||

那么我该如何获取最大值和最小值之间的数字差,以便添加前导空格?

1000,00| |
 666,67| | |
 333,33| |||
   0,01|||||

1
使用String.format()System.out.format()和模式如%7.2f来格式化数字,其中7表示数字的宽度,2表示小数部分的宽度。 - Alex Salauyou
既然你的数据已经有序,为什么不将所有内容都填充到与最高值相同的长度呢? - flakes
@SashaSalauyou 对于 %7.2f,其中 7 是最小宽度,并将使用空格填充,否则根据数字超过 7。 - flakes
1
@flkes 是的,你说得对。根据实际值,OP可以选择另一个宽度。 7只是一个例子(足够1000.00使用)。 - Alex Salauyou
我会尝试在所有数字前面加上零,直到最高位数字,以对齐排列。(避免前导空格) - JacksOnF1re
1个回答

3

快速而粗略:


double max = getMaximum(); // Get your maximum Y value
int smax = String.format("%.2f", max).length(); // Print as a string and get number of characters

在你的循环中:
System.out.format("%"+smax+".2f", value);

编辑,来自 @EJP 的评论

确实,在最大值上使用 log10 更加简洁高效。它会给你10的幂次,因此是将要使用的数字位数(减一)。虽然第一个解决方案很直接(计算字符数,这正是我们想要的),但这个解决方案在其他方面都更好:

double max = getMaximum();
int ndigits = (int)Math.floor(Math.log10(max)) + 1;
int precision = 2; // Number of digits after decimal point
String fmt = "%"+(ndigits+1+precision)+"."+precision+"f"; // "%x.pf", x is the TOTAL length, including the point and precision digits

在你的循环中:
System.out.format(fmt, value);

2
取log10的底数会简单得多。 - user207421
@EJP确实,不过我想你是指ceiling+1,这样ceil(log10(1000.0))=4。等我有编译器测试过后,我会更新我的答案。 - Matthieu
1
不,我的意思是floor(log10))+1,或者ceil(log10))。你在这里提出的仍然是错误的。它对于数字9给出2位数,对于数字11给出3位数。 - user207421
哈,你说得对!我没有注意到测试中的第一个空格...已经更正了。谢谢。 - Matthieu
@EJP我会选择floor()+1而不是ceil(),因为它可以给出正确的值(4),而当使用ceil()时,对于1000会得到3。 你还会继续点踩吗? - Matthieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接