Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich möchte einen UserLevel berechnen und auch ausgeben lassen.
Anhand von drei werten:
1. OnlineMinuten
2. Registrierungsdatum
3. Heutiges datum
ich komm net klar, immer wenn ich ne zahl eingebe kommt 0,0 % raus ,wenn ich jedoch die zeile mit
Code:
//double onMin = 1386996 ;
benutze dann kommt das ergebnis 48,0 % raus welches auch richtig ist
hier mal der gesamte bisherige code, ich arbeite mich langsam vorran, vorerst mit festen werten für die zeit zwischen den daten, da ich noch nicht weiß wie ich das umsetzen soll, hab also erstmal mit der berechnung angefangen.
Code:
public static void main(String[] args) throws IOException {
//Eingabe
System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
double onMin = System.in.read();
//Rechenweg
double min = 2854080 ;
//double onMin = 1386996 ;
double viel = 10 ;
double eingabezahl ;
double pro = 100 ;
double onMinRounded ;
double erg = (pro / min) * onMin ;
erg = Math.round( erg * 100. ) / 100.;
erg = (int) erg;
if (erg > viel ) {
System.out.println("Ziemlich viel!!!");
}
System.out.println("Du warst " + erg + " % Deines Lebens hier Online seit Du dich registriert hast");
}
}
Ich bin mir recht sicher dass dir das schon helfen wird (oder zumindest verwundern ;-) ).
Sogleich wird die Frage aufkommen, was da wohl passiert. Erklärung: klick
Lösung: nimm Scanner oder einen Reader (BufferedReader z.B.). Die Forensuche oder ein Java-Buch sollten dir helfen.
also ich hab die forensuche benutzt, google 5 - 6 stunden lang gequält, meine E-Book sammlung durchgeschaut, und mein Video2Brain auseinandergenommen, ich scheine einfach nicht den nötigen IQ zu haben >_<
das problem ist das ich eine ganzzahl eingebe und keine fließkommazahl, ach was solls ich poste nochmal das ganze
script,
Code:
public static void main(String[] args) throws IOException {
//Eingabe
System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
InputStreamReader isr = new InputStreamReader (System.in );
BufferedReader bReader = new BufferedReader ( isr ) ;
String onMin = bReader.readLine ();
Double onMinD = Double.parseDouble( onMin ) ;
//Rechenweg
double min = 1923840;
//double onMin = 967748; <----------hier habe ich den wert der eingegeben werden soll anfangs festegelegt, so klappts ja dann auch
int viel = 10 ;
double eingabezahl ;
double pro = 100 ;
double erg = (pro / min) * (double) onMinD ;
erg = Math.round( erg * 100. ) / 100.;
//Ausgabe
if (erg > viel ) {
System.out.println("Ziemlich viel!!!");
}
System.out.println("Du warst " + erg + " % Deines Lebens hier Online seit Du dich registriert hast");
bReader.close();
}
ich bekomme immer den fehler
Code:
Exception in thread "main" java.lang.NullPointerException
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:991)
at java.lang.Double.parseDouble(Double.java:510)
at DNA.java.Berechnung.main(Berechnung.java:39)
Java Result: 1
wenn ich die zahl ohne . eigebe, aber so soll das ja später sein, ich kann aber keinen integer parsen udn dann nachher in einen double umwandeln, oder ich habs falsch versucht >-<
ich verstehe irgenwie nicht, wo das Problem ist. Bei mir kommt keine Exception (bzw. ne andere).
Gib bitte mal so an was genau du machst:
Code:
Bitte eingeben wieviele OnlineMinuten du hast
0.1
Du warst 0.0 % Deines Lebens hier Online seit Du dich registriert hast
Bitte eingeben wieviele OnlineMinuten du hast
1000
Du warst 0.05 % Deines Lebens hier Online seit Du dich registriert hast
Bitte eingeben wieviele OnlineMinuten du hast
10,0
Exception in thread "main" java.lang.NumberFormatException: For input string: "10,0"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
at java.lang.Double.parseDouble(Double.java:482)
at TestClass.main(TestClass.java:24)
wenn ich beim ersten mal zb 123.456 eigebe dann klappt alles, wenn ich es jedoch beim nächsten mal wieder eingebe dann bekomme ich nen fehler gemeldet, wenn ich beim nächsten mal jeodch 123 ,also eine ganzzahl eingebe dann kommt wieder kein fehler, aber wenn ich danach nochmal eine ganzzahl eigebe dann kommt wieder ein fehler, dh ich muss immer abwechselnd eine fließkommazahl eingeben und dann eine ganzzahl, wer weiß waoran das liegt?
/*
* Berechnung.java
*
* Created on 23. November 2007, 15:05
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package DNA.java;
import java.text.*;
import java.io.* ;
import java.util.*;
import java.lang.*;
/**
*
* @author Administrator
*/
public class Berechnung {
/** Creates a new instance of Berechnung */
public Berechnung() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
//Eingabe der OnlineMinuten
System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
InputStreamReader isrOnMin = new InputStreamReader(System.in );
BufferedReader bReaderOnMin = new BufferedReader( isrOnMin ) ;
String onMin = bReaderOnMin.readLine();
Double onMinD = Double.parseDouble( onMin ) ;
// //Eingabe des Registrierungsdatums (soll nachher in Date from eingesetzt werden)
// System.out.println("Bitte eingeben seit wann du registriert bist (TT.MM.YYYY)");
//
// InputStreamReader isrDate = new InputStreamReader(System.in );
// BufferedReader bReaderDate = new BufferedReader( isrDate ) ;
// String regDate = bReaderDate.readLine();
//Rechenweg für die Prozent.
double min = 2450880; //soll später durch diffMins ersetzt werden
//double onMinD = 2848; // wird durch die eingabe vom user ersetzt
int viel = 10 ;
double pro = 100 ;
double erg = (pro / min ) * (double) onMinD ;
erg = Math.round( erg * 100. ) / 100.;
//Berechnung der Differenz zwischen Anmeldedatum und heutigem Datum in Minuten
try {
DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
Date from = df.parse("26.09.2003"); //soll später durch eine eingabe vom user ersetzt werden
Date to = df.parse("24.11.2007");
double diffMillis = to.getTime() - from.getTime();
double diffMins = diffMillis / (1000 * 60 ); //diffMins kann ich nicht in die berechnung einfügen als min, muss ich aber ,ist ja die differenz
System.out.println("Die Differenz in Minuten ist " + diffMins + " Minuten");
System.out.println("Du hast dich am " + df.format(from) + " hier registriert");
} catch (ParseException ex) {
ex.printStackTrace();
}
//Ausgabe
if (erg > viel ) {
System.out.println("Ziemlich viel!!!");
}
System.out.println("Du warst " + erg + " % Deines Lebens hier Online seit Du dich registriert hast");
//bReaderDate.close(); //schließt nachher den bufferedreader für die datumseingabe wieder.
bReaderOnMin.close();
}
}
wenn ich beim ersten mal zb 123.456 eigebe dann klappt alles, wenn ich es jedoch beim nächsten mal wieder eingebe dann bekomme ich nen fehler gemeldet, wenn ich beim nächsten mal jeodch 123 ,also eine ganzzahl eingebe dann kommt wieder kein fehler, aber wenn ich danach nochmal eine ganzzahl eigebe dann kommt wieder ein fehler, dh ich muss immer abwechselnd eine fließkommazahl eingeben und dann eine ganzzahl, wer weiß waoran das liegt?
Die Eingabe ist erst mal ein String. Der wird dann in ein double umgewandelt und dem double ist das egal, ob du Nachkommastellen im String hattest oder nicht.
Ich kann dir nur sagen: bei mir funktioniert das. Folge: du machst was anderes als ich :wink:
">" ist der Prompt auf der Kommandozeile.
Code:
> javac Berechnung.java
> java Berechnung
Bitte eingeben wieviele OnlineMinuten du hast
123.456
Die Differenz in Minuten ist 2188860.0 Minuten
Du hast dich am 26.09.2003 hier registriert
Du warst 0.01 % Deines Lebens hier Online seit Du dich registriert hast
> java Berechnung
Bitte eingeben wieviele OnlineMinuten du hast
123
Die Differenz in Minuten ist 2188860.0 Minuten
Du hast dich am 26.09.2003 hier registriert
Du warst 0.01 % Deines Lebens hier Online seit Du dich registriert hast
haha das mit dem (double) hab ich inzwischen schon gemacht, ich weiß auch wo mein (äusserst blöder) anfängerfehler war, wenn ich in der IDE die ich benutze etwas in die eingabe zeile schriebe beim ausführen, und dann später das prog nochmal ausführen lasse dann steht zwar die eingabe die ich beim letzten mal hab immernoch in der zeile, wenn ich jedoch dann einfach enter drücke, dann hab ich in wirklichkeit garnichts eingegeben und es wir dann halt als NIX interpretiert und ich bekomme den fehler,
kannst du mir zufällig noch sagen wie ich es mache das man noch ein datum eingeben kann, das wäre sehr nett,
ich denke man muss dann einen string eingeben und den in ein datum umwandeln, aber die syntax dafür kenn ich nicht
Date from = df.parse("26.09.2003"); //soll später durch eine eingabe vom user ersetzt werden
So oder so ähnlich würd ich das machen:
Code:
InputStreamReader isrOnMin = new InputStreamReader(System.in );
BufferedReader bReaderOnMin = new BufferedReader( isrOnMin ) ;
System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
String onMin = bReaderOnMin.readLine();
Double onMinD = Double.parseDouble( onMin ) ;
System.out.println("Registrierungsdatum");
String regDate = bReaderOnMin.readLine();
...
Date from = df.parse(regDate);
Dann natürlich noch Fehlerbehandlung. Wenn ein Benutzer z.B. "asdf" eingibt, das abfangen und nochmal eingeben lassen.
Grundsätzlich sollte man immer alle Benutzereingaben checken :wink:
Der fehler ist mal wieder einfach verschwunden 0o
mein programm funzt jetzt soweit, man kann also ein datum eingeben, dann wieviele minuten man dort verbracht hat seit man reg ist, und den rest ermittelt das programm, ich werde noch ne ausgabe machen wievielen stunden am tag die % sind, damit man sich auch etwas darunter vorstellen kann
hier mal der code, ich muss nur noch die usereingaben überprüfen und gegebenenfalls exeptions werfen
Code:
/*
* Berechnung.java
*
* Created on 23. November 2007, 15:05
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package DNA.java;
import java.text.*;
import java.io.* ;
import java.util.*;
import java.lang.*;
/**
*
* @author Administrator
*/
public class Berechnung {
/** Creates a new instance of Berechnung */
public Berechnung() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
//Eingabe der OnlineMinuten
System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
InputStreamReader isrOnMin = new InputStreamReader(System.in );
BufferedReader bReaderOnMin = new BufferedReader( isrOnMin ) ;
String onMin = bReaderOnMin.readLine();
Double onMinD = Double.parseDouble( onMin ) ;
//Eingabe des Registrierungsdatums (soll nachher in Date from eingesetzt werden)
System.out.println("Bitte eingeben seit wann du registriert bist (TT.MM.YYYY)");
InputStreamReader isrRegDate = new InputStreamReader(System.in );
BufferedReader bReaderRegDate = new BufferedReader( isrRegDate ) ;
String regDate = bReaderRegDate.readLine();
//System.out.println("Registrierungsdatum");
//Berechnung der Differenz zwischen Anmeldedatum und heutigem Datum in Minuten
try {
DateFormat defaultDate = DateFormat.getDateInstance();
String datum = defaultDate.format(new java.util.Date());
DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
Date from = df.parse(regDate);
//Date from = df.parse("26.09.2003"); //soll später durch eine eingabe vom user ersetzt werden
Date to = df.parse(datum);
double diffMillis = to.getTime() - from.getTime();
double diffMins = diffMillis / (1000 * 60 );
System.out.println("Die Differenz in Minuten ist " + diffMins + " Minuten");
System.out.println("Du hast dich am " + df.format(from) + " hier registriert");
double min = diffMins ;
int viel = 10 ;
double pro = 100 ;
double erg = (pro / min ) * (double) onMinD ;
erg = Math.round( erg * 100. ) / 100.;
//Ausgabe
if (erg > viel ) {
System.out.println("Ziemlich viel!!!");
}
System.out.println("Du warst " + erg + " % Deines Lebens hier Online seit Du dich registriert hast");
bReaderRegDate.close();
bReaderOnMin.close();
} catch (ParseException ex) {
ex.printStackTrace();
}
}
}
Ich würde das nicht mit Exceptions machen (geht zwar auch aber ist nicht so "elegant") sondern mit einem regulären Ausdruck (regex).
Such am besten mal hier im Forum oder im Netz nach regex, da findet sich recht viel zum Thema.
Beispiel:
Code:
//Eingabe besteht nur aus Ziffern
String ziffern = "12345";
if( ziffern.matches("[0-9]+") ) {
//Eingabe ok
} else {
//nicht nur Ziffern im String
}
//Eingabe ist ein Datum, kein Check auf gültiges Datum! Hier würde z.B. auch 99.00.9999 akzeptiert werden.
String datum = "02.03.2005";
if( datum.matches("[0-9]{2}\\.[0-9]{2}\\.[0-9]{4}") ) {
//Eingabe ok
} else {
//kein gültiges Datum
}
ich will dir nicht unrecht geben, zu regex findet sich sogar extrem viel im internet (google und so) und auch viele pdfs und die java doc nicht zu vergessen (die ich mit eh nur selten angucken weils alles in englisch ist und manchmal nicht so verständlich wie ein ausformulierter deutscher text )
aber das ist
ZUVIEL für mich kleinen anfänger, das mit regex schein mir genauso kompliziert zu sein wie java oder c++ SELBST, so viele dinge es dort zu beachten gibt.
muss ich mich jetzt erst noch 3 wochen mit regulären ausdrücken beschäftigen oder gibt es eine einfachere methode um die eingaben zu überprüfen und gegebenenfalls einen fehler auszugeben ?
bitte nicht falsch verstehn, ich weiß das irgendwann die zeit kommt in der ich mich intensiver mit regex beschäftigen muss, aber im für den moment möchte ich erstmal die grundsyntax von java verinnerlichen, und nicht gleich mit etwas eigenständigem neuen anfangen.
Regex sind nicht sooo schwierig zu verstehen wie es den Anschein hat. Zumindest die Grundlagen sind nicht so kompliziert. Aber ok, ich kann das nachvollziehen dass man am Anfang recht schnell überfordert ist.
Wie schon geschrieben, gibt es eine andere (evtl. einfachere) Möglichkeit, nämlich Exceptions auszunutzen.
Code:
//Ein Reader und ein InputStream reichen
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader bReader = new BufferedReader(isr);
Double onMinD;
Date from;
try {
System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
String onMin = bReader.readLine();
//so lange wiederholen bis Benutzer eine gültige Zahl eingibt.
while (true) {
try {
onMinD = Double.parseDouble(onMin);
break; //verlasse die while(true) Schleife
} catch (NumberFormatException n) {
//neu einlesen und weiter in der while() Schleife
System.out.println("keine korrekte Eingabe, bitte nochmal");
onMin = bReader.readLine();
}
}
DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
// Eingabe des Registrierungsdatums (soll nachher in Date from
// eingesetzt werden)
System.out.println("Bitte eingeben seit wann du registriert bist (TT.MM.YYYY)");
String regDate = bReader.readLine();
//so lange wiederholen bis Benutzer ein gültiges Datum eingibt.
//Gültig ist hier allerdings auch 00.99.9999!
while (true) {
try {
from = df.parse(regDate);
break; //verlasse die while(true) Schleife
} catch (ParseException p) {
//neu einlesen und weiter in der while() Schleife
System.out.println("keine korrekte Eingabe, bitte nochmal");
regDate = bReader.readLine();
}
}
bReader.close();
//jetzt hast du in from das eingegebene Datum und in onMinD die eingegebenen Onlineminuten.
} catch (IOException i) {
i.printStackTrace();
}
sorry hab den fehler behoben ist schon okay, danke für den codesnippet xDD
dann mach ich mich mal an die swing dran, ist ja auch noch ein buch mit sieben siegeln für mich, aber ich will ja eine GUI haben , ich hoffe ich kann wenigstens große teile meines programms übernehmen, und muss net alles komplett umschreiben
warum verschwindet der string level nach der if else verzweigung immer im nirvana und ist nachher nicht mehr initialized und kann somit auch nicht mehr ausgegeben werden? ich will das programm ein wenig kompakter und übersichtlicher gestalten.
Code:
String level;
if (erg <= selten ) {
level = "Das ist selten!!";
}else
if (erg <= wenig ) {
level = "Du bist wenig Online!!";
}
if (erg <= normal )
{
level = "Das ist normal!!";
}
if (erg <= schonMehr )
{
level = "Du bist Viel Online!!";
}
if (erg <= oft )
{
level = "Du bist zu oft Online!!";
}
if (erg <= sehrOft )
{
level = "Du bist s\u00fcchtig !!";
}
if (erg >= extrem )
{
level = "Du bist einer der absoluten Obersuchtys!!";
}
System.out.println(level);
man ey, ihr seid aber echt schnell hier, klasse forum, und so hilfsbereit, hab das jetzt so gelöst:
Code:
String level ="ich werde noch gebraucht xD";
if (erg <= selten )
{
level = "Das ist selten!!";
}
if (erg <= wenig )
{
level = "Du bist wenig Online!!";
}
if (erg <= normal )
{
level = "Das ist normal!!";
}
if (erg <= schonMehr )
{
level = "Du bist Viel Online!!";
}
if (erg <= oft )
{
level = "Du bist zu oft Online!!";
}
if (erg <= sehrOft )
{
level = "Du bist s\u00fcchtig !!";
}
if (erg >= extrem )
{
level = "Du bist einer der absoluten Obersuchtys!!";
}
System.out.println(level);