Java Rätsel

Hallo,

hier mal noch ein neues Rätsel:

Eine Zahl soll in ein Zahlenwort umgewandelt werden. Beispiel 2147483647 in "zwei Milliarden hundertsiebenundvierzig Millionen vierhundertdreiundachtzigtausendsechshundertsiebenundvierzig".
Wie macht man das möglichst schnell, einfach und elegant?
(Man darf auch zusatzlibs verwenden, aus dem Eclipse Project, Tomcat, Spring, Hibernate, etc.)

Keiner Hint als zusäzliche Anforderung: Man soll die Zahl auch auf "englisch" und "französisch" ausgeben können also bei 2147483647 :
englisch: two billion, one hundred and forty-seven million, four hundred and eighty-three thousand, six hundred and forty-seven
französisch: deux milliard cent quarante-sept million quatre cents quatre-vingt-trois mille six cents quarante-sept

Gruß Tom
 
Ich habs mal versucht, weiß aber nicht ob es gut funktioniert, oder noch mehr ob es sauber ist, habe es schnell runtergeschrieben, und nur ein mal am Ende ausprobiert.

Ach ja, habe es fürs erste nur bis Tausend gemacht, sollte aber einfach so erweiterbar sein.
 

Anhänge

Zuletzt bearbeitet:
Hallo,

danke Kai008 das du dich daran versucht hast :) Dein Ansatz funktioniert natürlich auch, jedoch muss man hier noch relativ viel "selber machen". Wie wärs denn damit?
Java:
/**
 * 
 */
package de.tutorials;

import java.util.Locale;

import com.ibm.icu.text.RuleBasedNumberFormat;

/**
 * @author Tom
 * 
 */
public class NumberSpelling {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int number = Integer.MAX_VALUE;
        System.out.println(number);
        System.out.println(new RuleBasedNumberFormat(Locale.GERMANY,
                RuleBasedNumberFormat.SPELLOUT).format(number));
        System.out.println(new RuleBasedNumberFormat(Locale.US,
                RuleBasedNumberFormat.SPELLOUT).format(number));
        System.out.println(new RuleBasedNumberFormat(Locale.FRANCE,
                RuleBasedNumberFormat.SPELLOUT).format(number));
    }
}

Ausgabe:
Code:
2147483647
zwei Milliarden hundertsiebenundvierzig Millionen vierhundertdreiundachtzigtausendsechshundertsiebenundvierzig
two billion, one hundred and forty-seven million, four hundred and eighty-three thousand, six hundred and forty-seven
deux milliard cent quarante-sept million quatre cents quatre-vingt-trois mille six cents quarante-sept

Kommt mir bekannt vor? Das kann sein, denn:
http://www.tutorials.de/forum/java/...ke-zahlenwort-zu-zahl-zahl-zu-zahlenwort.html

Gruß Tom
 
Letztendlich macht die RuleBasedNumberFormat-Version aber auch nicht viel anders als Kai008s Version, nur dass Kai008 die Funktionen selber geschrieben hat ;)
 
*Thread ausgrab* :D

Was wird ausgegeben wenn man folgendes Programm ausführt? Es dürfte zwar relativ klar sein, aber die Idee kam mir gerade heute und wunderte mich ob auch wirklich das "Gedachte" auf der Konsole ausgegeben wird.
Achja, das Warum könnt ihr auch noch angeben.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Foo implements ActionListener {
	public Foo() {
		new Foobar().a(this);
	}
	public static void main(String[] args) {
		new Foo();
	}
	public void actionPerformed(ActionEvent e) {}
}

class Foobar {
	public void a(ActionListener a) {
		System.out.println("actionlistener");
	}
	public void a(Foo foo) {
		System.out.println("foo");
	}
}
 
Zuletzt bearbeitet:
Ich denke
'foo'
, da Klassen wohl gegen Interface'e Vorrang haben.
Aber interessante Frage, eine genaue Erklärung ect. würde mich schon interessieren.
 
Hi,

ich tippe es wird "Foo" ausgegeben. Die übergebene Referenz ist vom Typ "Foo". Es verhält sich als würde "Foo" von "ActionListener" erben. Der Compiler prüft bei der überladenen Funktion erst ob Foo passt. Nur wenn das nicht passt, steigt er die Vererbungshierachie auf. Nicht auflösen könnte der Compiler dies:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;

public class Foo implements ActionListener, Serializable {
	public Foo() {
		new Foobar().a(this);
	}
	public static void main(String[] args) {
		new Foo();
	}
	public void actionPerformed(ActionEvent e) {} }

class Foobar {
	public void a(ActionListener a) {
		System.out.println("actionlistener");
	}
	public void a(Serializable foo) {
		System.out.println("Serializable");
	}
}

Gruß

Jo
 

Ich würde tippen, dass Foo ausgegeben wird.
Das warjm ist auch recht simpel. gehen wir davon aus die Klasse würde noch 5 weitere Interfaces implementieren, udn es gäbe nicht nur die Methode a mit einem ActionListener und Foo als Parameter, sondern auch noch die 5 weiteren Interfaces als Parameter. In diesem fall wäre es auf jeden Fall einfacher, wenn Foo genommen würde. Der einzige Knackpunkt der mir einfällt wäre, was dann passieren sollte wenn es die Methode mit Foo als Parameter nicht geben würde. Hier stehe ich dann auch auf dem Schlach. In diesem fall würde ich tippen entweder die Interfaces (mit Packageangabe!!) alphabetisch geordnet, oder in der Reihenfolge wie sie bei der Klassensignatur angegeben sind.

Edit:

Mir ist noch eingefallen, dass es auch sein könnte, dass danach geurteilt wird wie die Methoden im Quelltext auftauchen, in diesem fall, würde natürlich ActionListener ausgegeben, ich denke ich bleibe trotz dem bei meiner ersten Vermutung (siehe oben).
 
schade, dass dieser Thread schon wieder eingeschlafen ist. Ich hab jetzt alles mal durchgelesen und finde es sehr spannend :)
 
Zurück