2016-04-15 12 views
3

Für ein einfaches Befehlszeilenwerkzeug möchte ich ein einfaches Diagramm zeichnen, das einige Punkte und deren y-Achsenwerte zeigt. Für die y-Achse Kennzeichnung mag ich das Niveau der aktuellen „Reihe“ wie drucken:Unterschied der Ziffernanzahl zwischen 2 Zahlen

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

aber es kann passieren, dass der maximale Wert mehr Stellen als der Minimalwert hat:

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

Wie kann ich die Differenz der Ziffern zwischen dem Max- und Min-Wert erhalten, damit ich führende Leerzeichen hinzufügen kann?

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

siehe Number – ControlAltDel

+1

Verwendung 'String .format() 'oder' System.out.format() 'und ein Muster wie'% 7.2f' für eine Zahl, wobei '7' die Breite einer Zahl bezeichnet, '2' die Breite des Dezimalteils. –

+0

Angesichts der Tatsache, dass Ihre Daten in Ordnung sind, warum nicht alles auf die gleiche Länge wie den höchsten Wert auffüllen? – flakes

Antwort

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 

In der Schleife:

System.out.format("%"+smax+".2f", value); 

Bearbeiten von @ EJP Kommentar

Es ist in der Tat beide sauberer und effizienter zu log10 auf dem max. Es gibt Ihnen die Potenz von 10, also die Anzahl der Ziffern (minus eins), die verwendet werden. Während die erste Lösung ist unkompliziert (Zählen Zeichen, was gerade ist, was wir wollen), ist diese Lösung besser in jedem anderen Aspekt: ​​

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 

In der Schleife:

System.out.format(fmt, value); 
+2

Das Log10-Protokoll wäre viel einfacher. – EJP

+0

@EJP In der Tat, obwohl ich denke, du meinst Decke + 1, so dass ceil (log10 (1000.0)) = 4. Ich werde meine Antwort aktualisieren, wenn ich einen Compiler bekomme, um es richtig zu testen. – Matthieu

+1

Nein. Was ich wirklich meine, ist Boden (log10)) + 1 oder ceil (log10)). Was Sie hier vorgeschlagen haben, ist immer noch falsch. Es gibt 2 Ziffern für 9 und 3 für 11. – EJP

Verwandte Themen