# Zahl in Worte ausgeben



## Sindbad1983 (20. Nov 2004)

Hi!

Ich möchte einen Algorithmus entwickeln, der eine Zahl zwischen 1 und 999 einliest und "in Worte" übersetzt.

z.B.: 123 -> einhundert drei und zwanzig

Hat jemand eine Idee, wie man da vorgehen kann?
Ich hab leider keine!  :cry:

Wie erkennt er bei einer Eingabe z.B. den Unterschied zw. 3 und 13 (ein und 2-stellig)?


----------



## foobar (20. Nov 2004)

> Wie erkennt er bei einer Eingabe z.B. den Unterschied zw. 3 und 13 (ein und 2-stellig)?


An der Länge des Strings. 
Du mußt die Eingabe parsen und die entsprchenden Stellen mithilfe von Mappings konvertieren. Als erstes würde ich prüfen wie lang der String ist, damit man weiß welche Stelle welche Zehnerpotenz darstellt. Dann würde ich den String in einzelne Tokens zerlegen und entsprechend der Zehnerpotenz durch einen Hash konvertieren lassen.


----------



## Sindbad1983 (20. Nov 2004)

parsen check ich noch, aber Mapping sagt mir leider gar nichts!


----------



## foobar (20. Nov 2004)

Mit Mapping meine ich einen Hash der Ziffern in Zahlworte übersetzt.
Beispiel:

```
HashMap digits = new HashMap();
digits.put(new Integer("1"), "eins");
digits.put(new Integer("2"), "zwei");
......
```
Du könntest dir zwei Hashes anlegen einen für die Ziffern und einen für die Zahnerpotenzen z.b. hundert, tausend usw. 
Jetzt mußt du das ganze nur noch in geeignete Klassen aufteilen ;-).


----------



## Sindbad1983 (20. Nov 2004)

tut mir leid...ich kanns nicht!
Ich werd das Beispiel wohl lieber lassen!
Kann man das nicht auf einfachere Weise lösen?


----------



## foobar (20. Nov 2004)

> tut mir leid...ich kanns nicht!
> Ich werd das Beispiel wohl lieber lassen!


Gib doch nicht so schnell auf 

Hier ist ein kleiner Denkanstoß:

```
package digitconverter;

import java.util.HashMap;

public class Converter
{
	private HashMap digits;
	public Converter()
	{
		this.init();
	}
	
	private void init()
	{
		this.digits = new HashMap();
		this.digits.put(new Integer(0), "null");
		this.digits.put(new Integer(1), "eins");
		this.digits.put(new Integer(2), "zwei");
		this.digits.put(new Integer(3), "drei");
		this.digits.put(new Integer(4), "vier");
		this.digits.put(new Integer(5), "fünf");
		this.digits.put(new Integer(6), "sechs");
		this.digits.put(new Integer(7), "sieben");
		this.digits.put(new Integer(8), "acht");
		this.digits.put(new Integer(9), "neun");
	}
	
	
	public void getDigitWord(int in)
	{
		String input = ""+in;
		for (int i 	  = 0; i < input.length(); i++)
		{
			 String digit = input.substring(i,i+1);
			 System.out.print("i " + i + " >>" + this.digits.get(new Integer(digit)) + " >> " );
			 	
			if 	   ( i == input.length()-1){ 	 System.out.println("einer"); }
			else if ( i == input.length()-2){ 	 System.out.println("zehner"); }
			else if ( i == input.length()-3){ 	 System.out.println("hunderter"); }
			
		}
	}
	
	public static void main(String[] args)
	{
		new Converter().getDigitWord(123);
	}
}
```


----------



## Sindbad1983 (20. Nov 2004)

boa..das schaut nicht schlecht aus!
Ich muss jetzt aber leider weg!
Werd mir das morgen Vormittag nochmal genau anschaun!
Muss mich erst mal in deinen Code einlesen!
Das schaut schwierig aus! :-( 
Danke für deine Hilfe!
Hoffe du hilfst mir morgen auch noch! ;-)
ciao,Tommy 
PS: Möchts auf alle Fälle hinkriegen! Werds mit einem Array auch probiern! ciao


----------



## Sindbad1983 (21. Nov 2004)

Hi!

Ich hab jetzt versucht, dass ich weiter tu, bin aber leider schon wieder früh an meine Grenzen gestoßen!
Ich weiß einfach nicht, wie das geht, dass ich die Ausgabe der Zahlen verändere...

also bei 234 nicht zweihundert drei und vier, sondern zweihundert vier und drei !?!

Ich hoff, ich bekomm noch ein paar Tipps!
Jetzt möcht ichs schon gern hinbekommen!   :### 

Also das hab ich bis jetzt: is leider nicht viel mehr!  :cry: 


```
import java.util.HashMap;

public class Converter
{
   private HashMap digits, digits2;
   public Converter()
   {
      this.init();
   }

   private void init() //wozu brauch ich da eigentlich init? Dachte mir, das braucht man nur beim Applet!
   {
      this.digits = new HashMap();
      this.digits.put(new Integer(0), "null");
      this.digits.put(new Integer(1), "ein");
      this.digits.put(new Integer(2), "zwei");
      this.digits.put(new Integer(3), "drei");
      this.digits.put(new Integer(4), "vier");
      this.digits.put(new Integer(5), "fünf");
      this.digits.put(new Integer(6), "sechs");
      this.digits.put(new Integer(7), "sieben");
      this.digits.put(new Integer(8), "acht");
      this.digits.put(new Integer(9), "neun");
      this.digits.put(new Integer(10), "zehn");
      this.digits.put(new Integer(11), "elf");
      this.digits.put(new Integer(12), "zwölf");
      this.digits.put(new Integer(17), "siebzehn");
      this.digits.put(new Integer(18), "achtzehn");


      this.digits2=new HashMap(); //geht das überhaupt? Oder brauch ich da ne neue Klasse? brauch ich da ein 2.init()?
      this.digits2.put(new Integer(20),"zwanzig"); //es funktioniert nämlich eh nicht! :-( ...mit den digits2
      this.digits2.put(new Integer(30),"dreißig");
      this.digits2.put(new Integer(40),"vierzig");
      this.digits2.put(new Integer(50),"fünfzig");
      this.digits2.put(new Integer(60),"sechszig");
      this.digits2.put(new Integer(70),"siebzig");
      this.digits2.put(new Integer(80),"achtzig");
      this.digits2.put(new Integer(90),"neunzig");




   }


   public void getDigitWord(int in){

      String input = ""+in;
      for (int i      = 0; i < input.length(); i++){
          String digit = input.substring(i,i+1);


          if(input.length()==3){ //alle die 3 Stellen haben


         		 if(i==input.length()-1){

          			System.out.print(""+this.digits.get(new Integer(digit))+"");
	  	 		 }
	  	  		 else if(i==input.length()-2){
			  		System.out.println(""+this.digits.get(new Integer(digit))+" und ");
		  		 }
		  		 else if(i==input.length()-3){
			   		System.out.println(""+this.digits.get(new Integer(digit))+"hundert und");
		  		 } // wie man dann bei 257 5 und 7 vertauscht also zweihundert sieben und fünfzig..keine Ahnung!
	  		}

	  		else if(input.length()==2){
				//dasselbe wie oben.. etc
				//nur zum Probieren
				System.out.print(""+this.digits2.get(new Integer(digit))+""); //digits2 kennt er nicht..leider
			}


      }
   }

   public static void main(String[] args) {

	   Converter test=new Converter();
       test.getDigitWord(23);
   }
}
```
Naja..vielleicht schaff mas ja doch gemeinsam!   
Danke!


----------



## Wildcard (21. Nov 2004)

Das kommt schon ganz gut hin:


```
import java.util.HashMap; 

public class Converter 
{ 
   private HashMap digits, digits2; 
   public Converter() 
   { 
      this.init(); 
   } 

   private void init() //wozu brauch ich da eigentlich init? Dachte mir, das braucht man nur beim Applet! 
   { 
      this.digits = new HashMap(); 
      this.digits.put(new Integer(0), "null"); 
      this.digits.put(new Integer(1), "ein"); 
      this.digits.put(new Integer(2), "zwei"); 
      this.digits.put(new Integer(3), "drei"); 
      this.digits.put(new Integer(4), "vier"); 
      this.digits.put(new Integer(5), "fünf"); 
      this.digits.put(new Integer(6), "sechs"); 
      this.digits.put(new Integer(7), "sieben"); 
      this.digits.put(new Integer(8), "acht"); 
      this.digits.put(new Integer(9), "neun"); 
      this.digits.put(new Integer(10), "zehn"); 
      this.digits.put(new Integer(11), "elf"); 
      this.digits.put(new Integer(12), "zwölf");
      this.digits.put(new Integer(13), "dreizehn"); 
      this.digits.put(new Integer(14), "vierzehn"); 
      this.digits.put(new Integer(15), "fünfzehn");
      this.digits.put(new Integer(16), "sechzehn"); 
      this.digits.put(new Integer(17), "siebzehn"); 
      this.digits.put(new Integer(18), "achtzehn");
      this.digits.put(new Integer(19), "neunzehn"); 


      this.digits2=new HashMap(); //geht das überhaupt? Oder brauch ich da ne neue Klasse? brauch ich da ein 2.init()? 
      this.digits2.put(new Integer(2),"zwanzig"); //es funktioniert nämlich eh nicht! :-( ...mit den digits2 
      this.digits2.put(new Integer(3),"dreißig"); 
      this.digits2.put(new Integer(4),"vierzig"); 
      this.digits2.put(new Integer(5),"fünfzig"); 
      this.digits2.put(new Integer(6),"sechszig"); 
      this.digits2.put(new Integer(7),"siebzig"); 
      this.digits2.put(new Integer(8),"achtzig"); 
      this.digits2.put(new Integer(9),"neunzig"); 




   } 


   public void getDigitWord(int in){ 

      String input = ""+in; 
         
          
      if (input.length() == 1)
      {
          System.out.print(digits.get(new Integer(input.substring(0,1))));
      }
          
      else if (input.length() >= 2)
      {
          if (input.length() == 3)
          {
              System.out.print(digits.get(new Integer(input.substring(0,1)))+"hundert");
          }
          if (new Integer(input.substring(input.length()-2,input.length())).intValue()<20)
              System.out.print(digits.get(new Integer(input.substring(input.length()-2,input.length()))));
          else
              System.out.print(digits.get(new Integer(input.substring(input.length()-1,input.length()))) + "und" +digits2.get(new Integer(input.substring(input.length()-2,input.length()-1))));
      }

   } 

   public static void main(String[] args) { 

      Converter test=new Converter(); 
       test.getDigitWord(386); 
   } 
}
```

wenn du Java 5 benutzt nimm bitte statt 

```
new Integer()
```


```
Integer.valueOf()
```

thnx to deathbyaclown  :wink:


----------



## Sindbad1983 (21. Nov 2004)

booooooooooooaaaaa, das ist ja sensationell!

Es geht! Ich glaubs nicht!
DANKE!!!
Also war mein Ansatz  nicht soo schlecht?
Mensch, danke!
Das WE is gerettet!
ciao,Tommy


----------



## Sindbad1983 (21. Nov 2004)

ok..ich habs selber nochmal programmiert!
Zuerst total verwirrend mit dem ganzen substring-Zeugs..aber jetzt check ichs!
War eigentlich gar nicht so schwer!
Du hast das super gemacht Wildcard!
Danke!
Programmierst du schon lange?
Würdest du dieses Beispiel noch als Anfängerbeispiel bezeichnen?
Schönen Abend noch!
ciao


----------



## Wildcard (21. Nov 2004)

Danke für das Lob  8) 
Noch nicht lange, Java jetzt seid 2 Monaten.
Wenn dich dann dein Brötchengeber vor ein Programm
mit 700 Klassen und gut 35000 reinen Anweisungszeilen setzt,
ist man gezwungen ziemlich flott zu lernen  :wink: 
Würde schon sagen das es noch ein Anfängerbeispiel ist,
aber das ist wohl ansichtssache   

Viel Erfolg weiterhin


----------



## Sindbad1983 (21. Nov 2004)

naja..ein paar Dinge sind vielleicht doch noch nicht glasklar:  :autsch: 

1. warum die Methode init()? dachte man braucht die nur bei Applets?
gibts da auch ne andere Möglichkeit? oder braucht man das bei HashMaps?

2.  System.out.println(digits.get(new Integer(s.substring(0,1))));

wozu muss ich da nochmals eine Zahl erzeugen(new Integer) ?? wofür brauch ich das?

3. naja..das wars eigentlich schon  :idea: 

Danke für deine Hilfe!
Gute Nacht!


----------



## Wildcard (22. Nov 2004)

1)
Die init() Methode brauchst du nicht.
Da wird lediglich die Hasmap _init_ialisiert.
Kann man auch an jeder anderen Stelle machen, aber so ist schön übersichtlich.

2)
Eine Hasmap speichert Objekte und liefert Objekte.
Du kannst also als Key keine einfache Zahl benutzen, da int Werte keine Objekte sind.
Das new Integer() dient also nur dazu einen Key zu erzeugen.
Statt des new Integer hätte man z.b. auch einen String "9" in die Map packen können.
Wenn du Java 5 benutzt nimm statt dessen Integer.valueOf(), da man ja eigentlich kein neues Objekt
zu erzeugen braucht, sondern wie gesagt nur den Key will.

3) na dann is ja gut  :wink:


----------



## Illuvatar (22. Nov 2004)

Wenn du Java5 hast, schreib am besten nix von Integer, weil das dann autogeboxt wird


----------



## Sindbad1983 (22. Nov 2004)

> Statt des new Integer hätte man z.b. auch einen String "9" in die Map packen können.



1.Hast du das so gemeint?


```
this.digits = new HashMap();
      this.digits.put(new String("0"), "null");
      this.digits.put(new String("1"), "ein");
```

das geht nämlich nicht!  :cry: 


2.Ich hab Java 4...habs aber eh grad überall ausgebessert!
3.
nochmal zu wiederholen:

(Integer.valueOf(s.substring(0,1)) 

Die übergebene Zahl, die dann später als Wort ausgegeben werden soll, wird zuerst  in einen String s umgewandelt. -> also z.B. 9 wird zu "9" . Dann nimmt man mit substring einen Teil heraus ..z.B. von 0 bis 1 also eh  "9" , konvertiert den Inhalt von s in einen int-Wert und liefert ihn in einem neuen Integer-Objekt zurück!Oder?

also wenn man anders schreiben würd, würd da stehen:

Integer=(Integer.valueOf(s.substring(0,1)) oder?

und parseInt()  gibt nur eine int-Zahl zurück, gell?  :wink: 

4. also macht valueOf immer irgendein Objekt draus, oder?

wenn ich eine Zahl int habe und möchte draus ein String-Objekt generieren, schreib ich:

String=(String.valueOf(int i)), oder? Geht das auch?

Ich hoffe, das waren jetzt nicht zu viele Fragen!   

Ich bin euch sehr, sehr dankbar!
Danke,ciao


----------



## Guest (22. Nov 2004)

1. das new String brauchst du nicht.

einfach nur 

```
digits.put("0","null");
```

dann musst du aber auch wieder den gleichen Key zum herausholen benutzen, also


```
digits.get("0");
```

4.
um eine int Zahl in einen String umzuwandeln kann man einfach

```
String s = zahl+"";
```
schreiben.
Bei Java 1.4 ist 

```
Integer.valueOf()
```
genau das gleiche wie

```
new Integer()
```

Saug dir einfach mal Eclipse (gibts kostenlos unter  http://www.eclipse.org/),
und mach dir  die API URL für Javadoc rein, dann lernst du ziemlich schnell was geht und was nicht geht
und was wofür gut ist.


----------



## Wildcard (22. Nov 2004)

Sorry, war nicht eingelogt  :wink:


----------



## Sindbad1983 (22. Nov 2004)

und Feststellung 3 müsste auch stimmen oder?

Ich hab vorhin versucht, dass ich das Ganze mit Hilfe eines Arrays programmier!
Da häng ich aber grad ein bissl...kannst du mir da auch eventuell helfen, wenn du Zeit hast...!?
Finde den Fehler nicht! Danke!!!


----------



## Wildcard (22. Nov 2004)

3. stimmt fast, man konvertiert nicht zurück in int, weil Integer auch Strings parsen kann.
Sonst passt.

Wo hängts denn?


----------



## Sindbad1983 (22. Nov 2004)

im anderen Beitrag von mir stehts eh!
Ich möchts jetzt mit einem char-Array versuchen!
meine Variante funktioniert nur bei Zahlen von 1-9! 

Wenn ich jetzt z.B. 11 eingib, gehts nicht mehr!  Keine Ahnung warum!


----------



## Wildcard (22. Nov 2004)

Also ehrlich gesagt find ich's ja ein leicht seltsam von string zu char[] zu konvertieren,
einen String draus zu machen und dann was zu vergleichen, aber soll ja nicht mein Problem sein   


```
public class ConverterArray{ 

    char []s; //char-Array 
    String g; 
    StringBuffer sb; 

    public ConverterArray(){ 
   // s=new char[3]; //char-Array mit 3 Felder-> für Zahlen von 1-999 
    } 


    public void makeWords(String eingabe){ 

       s=eingabe.toCharArray(); //die Zahl in Form eines String soll aufgesplittet werden! 
       System.out.println("Laenge des Array: "+s.length); 

       sb=new StringBuffer();

       for(int i=0;i<s.length;i++){ 
               //hier könnte vielleicht der Fehler liegen!?! zumindest wenn ich z.B. "11" die Zahl ist! 
       sb.append(s[i]); 

       } 
       g=sb.toString(); 

       if(s.length==1){ //also bei einer einstelligen Zahl gehts sehr gut! 
             if(g.equals("1")){ 
                  System.out.println("eins"); 
             } 
             else if(g.equals("2")){ 
                System.out.println("zwei"); 
             } 
       } 

       else if(s.length==2){ //das funktioniert nicht! hängt das vielleicht mit dem StringBuffer zusammen? 
             if(g.equals("11")){ 
                System.out.println("elf"); 
             } 
       } 
    } 

    public static void main(String [] args){ 

       ConverterArray test=new ConverterArray(); 
       test.makeWords("11"); 
    } 
 }
```

du hast dir für jeden Schleifendurchlauf einen neuen StringBuffer angelegt, der somit natürlich
nur ein Zeichen enthält. Hab das s=new char[3] auskommentiert, da das sinnlos ist.


----------



## Sindbad1983 (22. Nov 2004)

Mensch...immer die selben Fehler!
Hast Recht!
Ok...ich werds jetzt weiterversuchen!
Danke..vielleicht darf ich dich wieder fragen, wenn ich hänge!?!
Aber das ist jetzt glaub ich schwieriger als wie mit HashMap!
Vielen Dank!!
ciao,Tommy


----------



## Wildcard (22. Nov 2004)

Stimmt, ist schwieriger. Vor allem unnötiger  :wink: 
Bei so kleinen Sachen kannst du mir auch einfach ne PN schicken.
Mach doch lieber mal ein kleines Spiel. Macht mehr Spaß.
Mastermind oder sowas in die Richtung.
Kann man gleich anfangen Swing zu lernen.


----------



## Sindbad1983 (22. Nov 2004)

ein kleines Spiel?
Hast da eine Idee?
Mastermind hört sich sehr, sehr schwierig an! 
Da weiß ich gar nicht, wo ich anfangen soll! :-(
Gute Nacht!
Tommy


----------



## Wildcard (22. Nov 2004)

Hab ich nach einer Woche java gemacht. Ging eigentlich. 
Nur den Code darf ich mir heute nicht mehr ansehen   
Oder TicTacToe, Schiffeversenken für 1-2 Spieler,
ein kleines Jump'n'Run, Snake, Vier Gewinnt. 
Keine Ahnung, überleg dir was


----------

