(Java AWT) Zahlen in % darstellen

whistler

Aktives Mitglied
Thread Starter
Dabei seit
06.10.2005
Beiträge
876
Reaktionspunkte
56
hi,

ich habe diverse zahlen folgendermaßen in prozent umgewandelt:

Code:
prozentA=java.lang.Math.round(fooA/laenge*100);

mein problem ist nun, dass die zahl

a.) immer mit xx.0% dargestellt wird, d.h. ohne nachkommastellen (ich hätte gerne xx.xx%)

b.) die summer der zahlen dementprechend auch keine 100% beträgt...


irgendjemand eine idee, was man da machen könnte?


ich bin noch nicht gut genug in java, deshalb konnte ich mit dem 'decimalformat'-befehl, den ich im internet gefunden habe, nicht wirklich etwas anfangen. mein gefühl sagt mir allerdings... ;)

http://java.sun.com/j2se/1.4.2/docs...http://mindprod.com/jgloss/decimalformat.html
http://mindprod.com/jgloss/decimalformat.html
 
NumberFormat kann dir da helfen
http://java.sun.com/j2se/1.5.0/docs/api/java/text/NumberFormat.html

Hohl dir einfach eine Instanz davon:
NumberFormat f = NumberFormat.getPercentInstance();

Die ist für das Darstellen von Prozentwerten geeignet und obendrein auch noch an die jeweilge Landeseinstellung angepasst (Dezimaltrennzeichen usw.)

Das Ding konfigurierst du dann entsprechend deiner Wünsche:
// mindestens 2 Nachkommastellen, höchstens 2
f.setMinimumFractionDigits(2);
f.setMaximumFractionDigits(2);

//mindestens 2 Stellen vor dem Komma, höchstens 3 (falls mal genau 100% rauskommen)
f.setMinimumIntegerDigits(2);
f.setMaximumIntegerDigits(3);

Wenn du das Ding verwendest, musst du dann nicht mehr mit 100 multiplizieren.

System.out.println(f.format(0.345678));
System.out.println(f.format(1 - 0.345678));

ergibt auf einem auf Deutsch eingestellten Rechner die Ausgabe:
34,57%
65,43%

UPDATE:
DecimalFormat könntest du dafür auch nehmen, ist eine konkrete Subklasse von NumberFormat.
... aber da NumberFormat schon über eine passende Methode verfügt...
 
danke :upten:
könntest du mir noch sagen, wo ich das reinschreiben muss...?

wäre das dann z.b.:

von

prozentA=java.lang.Math.round(fooA/laenge*100);



zu

prozentA=fooA.NumberFormat.getPercentInstance();
f.setMinimumFractionDigits(2);
f.setMaximumFractionDigits(2);
f.setMinimumIntegerDigits(2);
f.setMaximumIntegerDigits(3);

?


ich glaub jetzt mal nicht, aber wie schreib ich dass dann in den code?

danke nochmal...
 
Ja aber doch nur bei der /Ausgabe/ als String (oder bei der "absichtlichen" Umwandlung in int), jedenfalls habe ich dich so verstanden dass du die Zahl gerundet auf ein paar nachkommastellen ausgeben willst. Und das kannst ja mit den oben beschriebenen Methoden machen. An der Stelle wo du Die Strings ausgibst (labels, textfelder,...) angenommen mit "...text = " oder " print() " eben sowas: "...text = f.format(fooA/laenge*100);" bzw. "...print(f.format(fooA/laenge*100));"
 
naja... nich ganz so wies der vorposter beschrieben hat.

1. nicht mit 100 multiplizieren

2. number format ist keine zahl, sondern ein objekt, das zahlen formatiert. du musst das ding also nur einmal erzeugen und dir irgendwo merken.

also in etwa so:
NumberFormat f = NumberFormat.getPercentInstance();
f.setMinimumFractionDigits(2);
f.setMaximumFractionDigits(2);
f.setMinimumIntegerDigits(2);
f.setMaximumIntegerDigits(3);

[...]

prozentA=fooA / laenge;


.... und dann das ganze irgendwo ausgeben:
zb mit
System.out.println (f.format(fooA));

oder, falls du das in irgendein textfeld packen willst:

textfield.setText (f.format(fooA));
 
NumberFormat f = NumberFormat.getPercentInstance();
f.setMinimumFractionDigits(2);
f.setMaximumFractionDigits(2);
f.setMinimumIntegerDigits(2);
f.setMaximumIntegerDigits(3);

wenn ich das in meine variablen reinschreibe, meckert er und sagt '<identifier> expected"...

muss ich das noch irgendwie extra initialisieren?


//EDIT:
anscheinend ja...
http://www.artima.com/designtechniques/initializationP.html

wie mach ich das für number format?

danke nochmal; dann bin ich auch glücklich ;)
 
also der code steht so wie er da is bei mir in einem kleinen testprogramm... da wird nix gemeckert.
vielleicht noch ein
import java.text.NumberFormat;
ganz oben in die Datei rein?
 
das scheint zu funktionieren, allerdings sagt er nun, dass

prozentG=(f.format(fooG));

'incompatible types' sind...
 
naja... nich ganz so wies der vorposter beschrieben hat.

1. nicht mit 100 multiplizieren

2. number format ist keine zahl, sondern ein objekt, das zahlen formatiert. du musst das ding also nur einmal erzeugen und dir irgendwo merken.

1. ich hab mir jetzt seine Rechung gar nicht erst angeschaut, es ging ja nur darum was er mit dem Objekt machen kann.

2. hab ich auch nicht gesagt (...falls das noch zum ersten Satz gehoert).

whistler schrieb:
prozentG=(f.format(fooG));

Also solche Mini-Code Schnipsel helfen da echt nicht weiter. Woher sollen wir denn wissen was deine Variablen fuer Typen haben bzw. bedeuten?
 
@nine_inch_nail
er möchte da anscheinend eine int als dateitypen haben...
kann ich das dem objekt irgendwie zuweisen?
 
Also solche Mini-Code Schnipsel helfen da echt nicht weiter. Woher sollen wir denn wissen was deine Variablen fuer Typen haben bzw. bedeuten?



prozentG=(f.format(fooG));

prozentG und fooG sind beides integer (int).
fooG ist eine zahl, die nun in prozent zu prozentG umgewandelt werden soll...
 
Also f.format() liefert dir nen String, prozentG scheint ja ein int zu sein, was nicht passt, weder zu Nachkommastellen noch zu Strings.

Schreib doch mal ein bisschen mehr von deinem code (in code tags).

EDIT:
prozentG und fooG sind beides integer (int).
fooG ist eine zahl, die nun in prozent zu prozentG umgewandelt werden soll...

hmm, jetzt versteh ich's nicht mehr. Du wolltest doch ganz am Anfang mehr Nachkommastellen haben. Mit ints geht das ja eh nicht.
 
Also f.format() liefert dir nen String, prozentG scheint ja ein int zu sein, was ja nicht passt, weder zu Nachkommastellen noch zu Strings.

Schreib doch mal ein bisschen mehr von deinem code (in code tags).

EDIT: hmm, jetzt versteh ich's nicht mehr :)

in welchen typ muss ich prozentG dann umwandeln?
kann dir den code gerne schicken, aber der ist seeehr lang... (anfängercode halt ;) )

//EDIT:
die nachkommastellen bekomm ich doch durch 'format' oder nicht?

wenn wir/ihr keine lösung findet lass ich es sonst einfach mit /laenge*100...

//EDIT2:
ich könnt dir natürlich auch den code schicken und du baust mir das da rein :p
 
Also am besten du beschreibst mal ganz genau was du machen willst und welche Eingabewerte du hast, die du dann in Prozent ausgeben willst.


Willst du von einer Dezimalzahl die Nachkommastellen abschneiden und diese gekuerzte Dezimalzahl in einer neuen Variable speichern?

Oder:

Kommt es dir hauptsaechlich darauf an, dass die Ausgabe auf dem Bildschirm in einem Textfeld o.ae. auf zwei Nachkommastellen gekuerzt ist?
 
@maxpa
der 2. satz bezog sich nicht auf dein post ;-)

@whistler
du solltest dich dringend mit java vertraut machen ;-)

integer sind nicht so toll um prozentwerte zu brechnen, da dann nur mit ganzzahldevision gearbeitet wird:
5/10 ergibt da zum beispiel 0

wenn du einen der operdanden vor der division in ein double wandelst, dann wird das ergebnis auch ein double, und dann sind die nachkommastellen auch da. also sowas hier

((double) fooA) / laenge

NumberFormat.format () gibt es für doubles und für longs...
da wir mit dem ausdruck da oben ein double bekommen sollte das dann gehen:
f.format(((double) fooA) / laenge);

EDIT:
... wenn du das fing mit doubles fütterst, dann spuckt das NumberFormat auch die 2 nachkommastellen aus
 
vielen dank an alle, ich habe jetzt die lösung meines problems...

java.text.NumberFormat nf = java.text.NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);

und dann

prozentG=Double.parseDouble(nf.format(dummG/laenge*100));

klappt wunderbar...

danke nochmal
 
Zuletzt bearbeitet:
Zurück
Oben Unten