Hiho,
bin noch recht neu in Java und schreibe grad ein kleines Programm zur Umwandlung verschiedener Zahlensysteme (erstmal nur 2,8,10,16). Ist an sich ja relativ einfach mit Funktionen wie parseInt(x, n) und toBinaryString().
Mein Problem liegt jetzt bei negativen und Bruchzahlen. An sich weiss ich wie man sie per Hand umwandelt, meine Frage ist jetzt ob es dafür auch eine simplere, von Java bereits mitgelieferte Methode gibt oder muss ich das jetzt für jedes Zahlensystem von Hand machen?
Das Programm sieht zur Zeit so aus:
Welcher Weg ist also am einfachsten?Code:import java.awt.*; import java.applet.*; import java.awt.event.*; //Variablen deklarieren public class Umwandler extends Applet implements ActionListener { Label Titel, Resultat; Button Convert, Copy; TextField Eingabe; Choice Format; Checkbox Negative; //Buttons und Textfelder erstellen und beschriften public void init (){ Titel = new Label ("UMWANDLER",Label.CENTER); Titel.setBackground(new java.awt.Color(255,255,128)); Eingabe = new TextField(""); Resultat = new Label ("Resultat",Label.CENTER); Resultat.setBackground(new java.awt.Color(255,255,255)); Format = new Choice(); Format.add("Dezimal -> Binär"); Format.add("Dezimal -> Hexadezimal"); Format.add("Dezimal -> Octal"); Format.add("Binär -> Dezimal"); Format.add("Binär -> Hexadezimal"); Format.add("Binär -> Octal"); Format.add("Hexadezimal -> Dezimal"); Format.add("Hexadezimal -> Binär"); Format.add("Hexadezimal -> Octal"); Format.add("Octal -> Dezimal"); Format.add("Octal -> Binär"); Format.add("Octal -> Hexadezimal"); Convert = new Button ("CONVERT"); Convert.addActionListener(this); Copy = new Button ("copy result to textfield"); Copy.addActionListener(this); Negative = new Checkbox("Negative Zahl?",null,false); setSize(200, 200); setLayout(new GridLayout(7, 1)); add(Titel); add(Eingabe); add(Format); add(Negative); add(Convert); add(Resultat); add(Copy); } public void actionPerformed(ActionEvent z) { if (z.getActionCommand() == "CONVERT") { switch (Format.getSelectedIndex()){ case 0: int dtb = Integer.valueOf(Eingabe.getText()); String dtbStr = Integer.toBinaryString(dtb); Resultat.setText(dtbStr); break; case 1: int dth = Integer.valueOf(Eingabe.getText()); String dthStr = Integer.toHexString(dth); Resultat.setText(dthStr); break; case 2: int dto = Integer.valueOf(Eingabe.getText()); String dtoStr = Integer.toOctalString(dto); Resultat.setText(dtoStr); break; case 3: int btd = Integer.parseInt(Eingabe.getText(), 2); String btdStr = Integer.toString(btd); Resultat.setText(btdStr); break; case 4: int bth = Integer.parseInt(Eingabe.getText(), 2); String bthStr = Integer.toHexString(bth); Resultat.setText(bthStr); break; case 5: int bto = Integer.parseInt(Eingabe.getText(), 2); String btoStr = Integer.toOctalString(bto); Resultat.setText(btoStr); break; case 6: int htd = Integer.parseInt(Eingabe.getText(), 16); String htdStr = Integer.toString(htd); Resultat.setText(htdStr); break; case 7: int htb = Integer.parseInt(Eingabe.getText(), 16); String htbStr = Integer.toBinaryString(htb); Resultat.setText(htbStr); break; case 8: int hto = Integer.parseInt(Eingabe.getText(), 16); String htoStr = Integer.toOctalString(hto); Resultat.setText(htoStr); break; case 9: int otd = Integer.parseInt(Eingabe.getText(), 8); String otdStr = Integer.toString(otd); Resultat.setText(otdStr); break; case 10: int otb = Integer.parseInt(Eingabe.getText(), 8); String otbStr = Integer.toBinaryString(otb); Resultat.setText(otbStr); break; case 11: int oth = Integer.parseInt(Eingabe.getText(), 8); String othStr = Integer.toHexString(oth); Resultat.setText(othStr); break; default: break; } } else if (z.getActionCommand() == "copy result to textfield") { String copyresult = String.valueOf(Resultat.getText()); Eingabe.setText(copyresult); } } }
Danke schonmal im Vorraus.
-
23.06.2009, 16:34 #1Lieutenant
- Dabei seit
- Jun 2009
- Ort
- Luxemburg
- Beiträge
- 893
[Java] Zahlensysteme umwandeln (mit Komma/Vorzeichen)
- Anzeige
Logge dich ein, um diese Anzeige nicht zu sehen. -
23.06.2009, 17:21 #2Lieutenant
- Dabei seit
- Nov 2006
- Beiträge
- 530
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
Puh äh mit Komma... das ist eigentlich in anderen Zahlensystemen als dem 10er nicht üblich, aber möglich. Kann mir aber nicht vorstellen, dass dafür schon was in den Standardbibliotheken dabei ist.
Schau dir einfach hier die Vorgehensweise beim Umrechnen an, und forme das in Java-Code ;-)CAS: Tt Shark
CPU: Intel E8400 (3000 MHz @4550 MHz & 1,42v LLC) + Tt BigWater 745 Wakü (Eheim Pumpe) + Liquid Pro WLP
MOB: Asus P5E Deluxe X48 @RAMPAGE FORMULA BIOS, max. FSB 552 MHz, Perf.-LVL 9
RAM: OCZ max. @DDR2-1130, 5-5-5-15-2T, 2,22v
GPU: PNY 8800 GT @1,00V, 630/1566/900, 102° C @Load ;D
SuperPi 1M / 32M: 9,965s @4,7 Ghz / 11m 18,649s @4,5 Ghz
-
23.06.2009, 17:49 #3Lieutenant
Ersteller dieses Themas
- Dabei seit
- Jun 2009
- Ort
- Luxemburg
- Beiträge
- 893
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
Danke schonmal für die Antwort. Kommazahlen kommen sicherlich in anderen Systemen nicht so oft vor, da ich sie aber öfters in meinem ersten Semester Microcontroller benutzt habe wollt ich sie halt mit reinnehmen. Mit float/double sollte das doch machbar sein oder?
Notfalls verzichte ich auch darauf, aber die negativen Zahlen sind mir schon wichtig. Von Dezimal nach Bin/Oct/Hex funzt das ja auch, bis auf die Tastsache, dass vorne alles mit 1 oder f aufgefüllt wird so dass man nicht mehr erkennt wo der Eigentliche Wert nun anfängt oder auch nicht. Umgekehrt oder funzt es aber natürlich nicht mehr, das Programm weiss ja nicht ob es jetzt eine negative Zahl ist oder nicht.
-
23.06.2009, 18:51 #4
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
Doch geht auch, aber der Aufwand das zu implementieren ist wesentlich höher. Der Trick dabei ist es als Datentyp String zu verwenden. Wie wir alle wissen, hat ein String ebenfalls eine Indexierung wie ein Array. D.h. wenn eine negative Zahl eingegeben wird(Bedingung: das Minuszeichen vor der Zahl muss mit eingegeben werden), dann prüft man ob an String-Index[0] ein "-" steht, als ein char (geht auch über ASCI Tabelle mit int-Werten) und formt dementsprechend nach den Regeln um. Ich hatte das ganze mal für eine Stack-Infix-to-Postfix Auswertung geschrieben... Also wenn du Spass am Programmieren hast, dann leg los..
-
23.06.2009, 19:08 #5Lieutenant
Ersteller dieses Themas
- Dabei seit
- Jun 2009
- Ort
- Luxemburg
- Beiträge
- 893
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
In diesem Fall ist es eher eine Muss-Sache als Spaß am programmieren^^
Muss das dann also doch Step-by-Step machen.....
Hatte jetzt 'ne Checkbox eingebaut so dass man separat angeben muss ob es sich jetzt um eine negative Zahl handelt oder nicht. Denn das "-" wird ja nur im dezimalen System benutzt.
-
23.06.2009, 19:10 #6
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
Viele Wege führen nach Rom...
-
23.06.2009, 21:05 #7Lieutenant
Ersteller dieses Themas
- Dabei seit
- Jun 2009
- Ort
- Luxemburg
- Beiträge
- 893
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
So, sieht jetzt folgendermaßen aus:
Methode für 2er KomplementCode:... import java.lang.Math.*; ... ... ... public void actionPerformed(ActionEvent z) { if (z.getActionCommand() == "CONVERT") { boolean checked = Negative.getState(); switch (Format.getSelectedIndex()){ case 0: if (checked == true){ int dtb = Math.abs(Integer.valueOf(Eingabe.getText())); Resultat.setText(getComplement(dtb)); } else { int dtb = Integer.valueOf(Eingabe.getText()); String dtbStr = Integer.toBinaryString(dtb); Resultat.setText(dtbStr); } break; case 1: if (checked == true){ int dth = Math.abs(Integer.valueOf(Eingabe.getText())); String dthStr = Integer.toHexString(Integer.parseInt(getComplement(dth),2)); Resultat.setText(dthStr); } ... ... ...
Scheint so zu funktionieren. Nur noch für die 9 anderen Fälle einbauen dann sollten die Negativzahlen kein Problem mehr seinCode:public static String getComplement(int x){ String ToComplement = Integer.toBinaryString(x); String Invert = ToComplement.replaceAll("0","x").replaceAll("1","0").replaceAll("x","1"); int a = Integer.parseInt(Invert,2); int b = 1; int c = a + b; String Complement = Integer.toBinaryString(c); return Complement; }
edit: hmpf mist, klappt doch nicht 100% richtig -.-Geändert von nenji.lu (23.06.2009 um 21:37 Uhr)
-
24.06.2009, 08:15 #8Cadet 4th Year
- Dabei seit
- Feb 2008
- Beiträge
- 119
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
Sagst du uns was nicht richtig funktioniert?edit: hmpf mist, klappt doch nicht 100% richtig -.-
-
24.06.2009, 11:26 #9Lieutenant
Ersteller dieses Themas
- Dabei seit
- Jun 2009
- Ort
- Luxemburg
- Beiträge
- 893
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
Na ich hab den Fehler gemacht, dass ich teils 'ne negative Zahl in eine Positive umgewandelt habe, will jedoch für eine negative Nahl auch ein negatives Resultat. Außerdem habe ich vergessen die "1" als Vorzeichen mit hinzu zu geben. Also aus -10 wurde z.B. 0110 anstatt 10110. Wenn man das zurückwandelt kommt dann -2 anstatt -10 raus.
Gibt es eine Möglichkeit die Nullen immer alle mitzunehmen, also so, dass das Programm 0110 mitnimmt und nicht automatisch 110 ausspuckt?
edit: sieht zur Zeit so aus:
Bei case 4,5,7,8,10,11 sind die ifelse Anweisungen noch gleich, hat sich erst nachträglich so ergeben als ich alles in negative Ergebnisse geändert habe.Code:import java.awt.*; import java.applet.*; import java.awt.event.*; import java.lang.Math.*; //Variablen deklarieren public class Umwandler extends Applet implements ActionListener { Label Titel, Resultat; Button Convert, Copy; TextField Eingabe; Choice Format; Checkbox Negative; //Buttons und Textfelder erstellen und beschriften public void init (){ Titel = new Label ("UMWANDLER",Label.CENTER); Titel.setBackground(new java.awt.Color(255,255,128)); Eingabe = new TextField(""); Resultat = new Label ("Resultat",Label.CENTER); Resultat.setBackground(new java.awt.Color(255,255,255)); Format = new Choice(); Format.add("Dezimal -> Binär"); //dtb Format.add("Dezimal -> Hexadezimal"); //dth Format.add("Dezimal -> Octal"); //dto Format.add("Binär -> Dezimal"); //btd Format.add("Binär -> Hexadezimal"); //bth Format.add("Binär -> Octal"); //bto Format.add("Hexadezimal -> Dezimal"); //htd Format.add("Hexadezimal -> Binär"); //htb Format.add("Hexadezimal -> Octal"); //hto Format.add("Octal -> Dezimal"); //otd Format.add("Octal -> Binär"); //otb Format.add("Octal -> Hexadezimal"); //oth Convert = new Button ("CONVERT"); Convert.addActionListener(this); Copy = new Button ("copy result to textfield"); Copy.addActionListener(this); Negative = new Checkbox("Negative Zahl?",null,false); setSize(200, 200); setLayout(new GridLayout(7, 1)); add(Titel); add(Eingabe); add(Format); add(Negative); add(Convert); add(Resultat); add(Copy); } public void actionPerformed(ActionEvent z) { if (z.getActionCommand() == "CONVERT") { boolean checked = Negative.getState(); switch (Format.getSelectedIndex()){ case 0: if (checked == true){ int dtb = Math.abs(Integer.valueOf(Eingabe.getText())); Resultat.setText(getComplement(dtb)); } else { int dtb = Integer.valueOf(Eingabe.getText()); String dtbStr = Integer.toBinaryString(dtb); Resultat.setText(dtbStr); } break; case 1: if (checked == true){ int dth = Math.abs(Integer.valueOf(Eingabe.getText())); String dthStr = Integer.toHexString(Integer.parseInt(getComplement(dth), 2)); Resultat.setText(dthStr); } else { int dth = Integer.valueOf(Eingabe.getText()); String dthStr = Integer.toHexString(dth); Resultat.setText(dthStr); } break; case 2: if (checked == true){ int dto = Math.abs(Integer.valueOf(Eingabe.getText())); String dtoStr = Integer.toOctalString(Integer.parseInt(getComplement(dto), 2)); Resultat.setText(dtoStr); } else { int dto = Integer.valueOf(Eingabe.getText()); String dtoStr = Integer.toOctalString(dto); Resultat.setText(dtoStr); } break; case 3: if (checked == true){ int btd = Integer.valueOf(Eingabe.getText(), 2); String btdStr = Integer.toString(Integer.parseInt(getComplement(btd), 2)); Resultat.setText("-" +btdStr); } else { int btd = Integer.parseInt(Eingabe.getText(), 2); String btdStr = Integer.toString(btd); Resultat.setText(btdStr); } break; case 4: if (checked == true){ int bth = Integer.valueOf(Eingabe.getText(), 2); String bthStr = Integer.toHexString(bth); Resultat.setText(bthStr); } else { int bth = Integer.parseInt(Eingabe.getText(), 2); String bthStr = Integer.toHexString(bth); Resultat.setText(bthStr); } break; case 5: if (checked == true){ int bto = Integer.valueOf(Eingabe.getText(), 2); String btoStr = Integer.toOctalString(bto); Resultat.setText(btoStr); } else { int bto = Integer.parseInt(Eingabe.getText(), 2); String btoStr = Integer.toOctalString(bto); Resultat.setText(btoStr); } break; case 6: if (checked == true){ int htd = Integer.valueOf(Eingabe.getText(), 16); String htdStr = Integer.toString(Integer.parseInt(getComplement(htd), 2)); Resultat.setText("-" +htdStr); } else { int htd = Integer.parseInt(Eingabe.getText(), 16); String htdStr = Integer.toString(htd); Resultat.setText(htdStr); } break; case 7: if (checked == true){ int htb = Integer.valueOf(Eingabe.getText(), 16); String htbStr = Integer.toBinaryString(htb); Resultat.setText(htbStr); } else { int htb = Integer.parseInt(Eingabe.getText(), 16); String htbStr = Integer.toBinaryString(htb); Resultat.setText(htbStr); } break; case 8: if (checked == true){ int hto = Integer.valueOf(Eingabe.getText(), 16); String htoStr = Integer.toOctalString(hto); Resultat.setText(htoStr); } else { int hto = Integer.parseInt(Eingabe.getText(), 16); String htoStr = Integer.toOctalString(hto); Resultat.setText(htoStr); } break; case 9: if (checked == true){ int otd = Integer.valueOf(Eingabe.getText(), 8); String otdStr = Integer.toString(Integer.parseInt(getComplement(otd), 2)); Resultat.setText("-" +otdStr); } else { int otd = Integer.parseInt(Eingabe.getText(), 8); String otdStr = Integer.toString(otd); Resultat.setText(otdStr); } break; case 10: if (checked == true){ int otb = Integer.valueOf(Eingabe.getText(), 8); String otbStr = Integer.toBinaryString(otb); Resultat.setText(otbStr); } else { int otb = Integer.parseInt(Eingabe.getText(), 8); String otbStr = Integer.toBinaryString(otb); Resultat.setText(otbStr); } break; case 11: if (checked == true){ int oth = Integer.valueOf(Eingabe.getText(), 8); String othStr = Integer.toHexString(oth); Resultat.setText(othStr); } else { int oth = Integer.parseInt(Eingabe.getText(), 8); String othStr = Integer.toHexString(oth); Resultat.setText(othStr); } break; default: break; } } else if (z.getActionCommand() == "copy result to textfield") { String copyresult = String.valueOf(Resultat.getText()); Eingabe.setText(copyresult); } } public static String getComplement(int x){ String ToComplement = Integer.toBinaryString(x); String Invert = ToComplement.replaceAll("0","x").replaceAll("1","0").replaceAll("x","1"); int a = Integer.parseInt(Invert,2); int b = 1; int c = a + b; String Complement = Integer.toBinaryString(c); return Complement; } }Geändert von nenji.lu (24.06.2009 um 12:07 Uhr)
-
24.06.2009, 16:20 #10Cadet 4th Year
- Dabei seit
- Feb 2008
- Beiträge
- 119
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
Kenne leiders keine Möglichkeit. Aber du könntest einfach mit Nullen auffüllen und etwas formatieren:Gibt es eine Möglichkeit die Nullen immer alle mitzunehmen, also so, dass das Programm 0110 mitnimmt und nicht automatisch 110 ausspuckt?
Mir ist aufgefallen das bei Zahlen mit mehr als 9 Stellen eine NumberFormatExeption ausgelöst wird...Code [php]:else { int dtb = Integer.parseInt(Eingabe.getText()); StringBuffer dtbStr = new StringBuffer(Integer.toBinaryString(dtb)); // Erstes "Nibble" mit Nullen auffüllen try{ dtbStr = dtbStr.insert(0, "000",0,4-(dtbStr.length()%4)); } catch (IndexOutOfBoundsException e){ // String Länge durch 4 teilbar } // "Nibble" mit Leerschlag formatieren int i = 4; int ii = 0; while(i < dtbStr.length()-ii){ dtbStr = dtbStr.insert(i+ii," "); i+=4; ii+=1; } Resultat.setText(dtbStr.toString()); } break;
-
24.06.2009, 21:27 #11Lieutenant
Ersteller dieses Themas
- Dabei seit
- Jun 2009
- Ort
- Luxemburg
- Beiträge
- 893
[Java] AW: Zahlensysteme umwandeln (mit Komma/Vorzeichen)
Vielen Dank, werd ich mir nachher mal anschauen.

Zitieren
