2016-04-15 14 views
3

単純なコマンドラインツールでは、いくつかの点とそのy軸値を示す簡単なグラフを描きたいと思います。2つの数字の間の桁数の差を取得する

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||||| 

y軸標識のために、私は次のように現在の「行」のレベルを印刷したいですだから、どのようにして最大値と最小値の間の数字の違いを得ることができるので、先行スペースを追加できますか?

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

がNumberFormatを – ControlAltDel

+1

使用を参照してください '文字列最初の解決策は簡単ですが、そのソリューションは、他のすべての面で優れている(私たちが望むものをまっすぐにある、文字を数えます) '7'は数字の幅、' 2'は小数部の幅を表します。数字は '.format()'や 'System.out.format()'や '%7.2f'のようなパターンです。 –

+0

データが整理されていることを考えれば、すべてを最大値と同じ長さにパッドするだけではいかがですか? – flakes

答えて

3

Quick'n'dirty:あなたのループでは

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の威力を与えます。したがって、使用される桁数(マイナス1)が得られます。あなたのループでは

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のフロアを取る方がずっと簡単です。 – EJP

+0

@EJP実際、ceil(log10(1000.0))= 4となるようにceiling + 1を意味していたと思います。コンパイラを正しくテストするために私の答えを更新します。 – Matthieu

+1

いいえ、実際にはfloor(log10))+ 1、ceil(log10)です。あなたがここで示唆したことはまだ間違っています。それは9桁2桁、11桁3桁を返します。 – EJP

関連する問題