Int in Strings umwandeln und dann ausgeschrieben haben

Nightmeow3

Mitglied
Hallo, Ich muss Ints in Strings umwandeln und diese dann ausgeben. z.B. 4711 wird zu "4 7 1 1" und danach diese ausschreiben, also " vier sieben eins eins". Es funktioniert auch mehr oder weniger aber wenn die Zahl mit 0 anfängt, ist alles falsch. Könnte mir jemand damit helfen? Vielen Dank.

public class WordNumeralFormat { public static String toString(int zahlen) { String zahlenString = Integer.toString(zahlen); String[] digits = zahlenString.split(""); String wiedergabe = ""; for(int i = 0; i < digits.length; i++) { switch(digits[i]) { case "0": wiedergabe += "null" + " "; break; case "1": wiedergabe += "eins" + " "; break; case "2": wiedergabe += "zwei" + " "; break; case "3": wiedergabe += "drei" + " "; break; case "4": wiedergabe += "vier" + " "; break; case "5": wiedergabe += "fuenf" + " "; break; case "6": wiedergabe += "sechs" + " "; break; case "7": wiedergabe += "sieben" + " "; break; case "8": wiedergabe += "acht" + " "; break; case "9": wiedergabe += "neun" + " "; break; default: wiedergabe += ""; } } return wiedergabe; } public static void main(String[] args) { System.out.print(toString(4711)); } }
 

httpdigest

Top Contributor
aber wenn die Zahl mit 0 anfängt, ist alles falsch.

Was genau meinst du damit? Welche ganze Zahl fängt denn mit der Ziffer 0 an (also außer die Zahl 0 natürlich, die nur aus der 0 besteht)?
Bedenke auch: Wenn du in Java ein Integer-Literal mit 0 beginnend angibst, also z.B. 0123 schreibst, ist das KEINE Dezimalzahl, sondern eine Oktalzahl.
Wenn du 0123 im Java Code direkt als Integer-Literal schreibst, ist es also die Dezimalzahl 83.
 

KonradN

Super-Moderator
Mitarbeiter
Also erst einmal ist natürlich wichtig, was @httpdigest gesagt hat: mit einer 0 am Anfang wird das Literal zu einem Oktalen Literal.

Aber dann auch von der Logik her: Eine Zahl fängt nicht mit 0 an. Eine Zahl 07 ist und bleibt die 7. Das ist also nur eine reine Frage der Darstellung, was dann zum nächsten Punkt führt:

Was Du evtl. meinst ist: Die Zahl soll immer 4-Stellig angegeben werden. Dann müsstest Du also schauen, wie viele Ziffern Du hast um dann die entsprechende Anzahl an 0er voran zu stellen.
 

Nightmeow3

Mitglied
Es muss nicht unbedingt 4-Stellig sein. Und der Prof. hat bei der Aufgabenstellung Folgendes gesagt: "Die Methode toString soll keine führenden Nullen ausgeben (d.h. die erste ausgegebene Ziffer ist nie „null“, es sei denn, es handelt sich um die Zahl 0).". Hilft das? Ansonsten kann ich auch dir die gesamte Aufgabenstellung geben
 

KonradN

Super-Moderator
Mitarbeiter
Ah so, dann hatte ich die Problematik nur missverstanden. Dann ist das Problem vermutlich wirklich nur der Punkt, den @httpdigest angesprochen hat. Sobald ein Integer Literal mit einer 0 startet, wird die Zahl im Oktal System aufgewertet.
 

Blender3D

Top Contributor
Hallo, Ich muss Ints in Strings umwandeln und diese dann ausgeben. z.B. 4711 wird zu "4 7 1 1" und danach diese ausschreiben, also " vier sieben eins eins".
Also das Nullproblem ist ja hier bereits ausführlich besprochen worden.
Ich möchte dich auf eine andere Möglichkeit als switch case aufmerksam machen.
Ich spreche von einem sogenannten Lookuptable. Das bedeutet du legst ein String Array an mit den Namen aller Ziffern.
An der Stelle 0 --> null, 1 --> eins ...
Das hat den Vorteile.
1) Der Zugriff auf den Namen erfolgt über den Index und nicht über eine Bedingung ( Vergleich )
2) Dieser Lookuptable könnte übergeben werden und damit auch andere Sprachen unterstützen.
0 --> zero, 1 --> one ...
3) Derselbe Lookuptable kann auch für die Umkehrfunktion benutzt werden.
4) Der Code wird verkürzt.

Java:
public class DigitsToNames {
    private static String[] names = { "null", "eins", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht",
            "neun" };
    private final static String SEPERATOR = " ";

    public static void main(String[] args) {
        String name = toNameString(0);
        System.out.println(name);
        System.out.println(nameStringToInt(name));
    }

    public static int nameStringToInt(String str) throws IllegalArgumentException {
        String[] digit = str.split(SEPERATOR);
        StringBuilder tmp = new StringBuilder();
        for (String s : digit)
            tmp.append(nameToInt(s));
        return Integer.parseInt(tmp.toString());
    }

    private static int nameToInt(String str) {
        for (int i = 0; i < names.length; i++) {
            if (str.equals(names[i]))
                return i;
        }
        throw new IllegalArgumentException(str + " is no valid digit name!");
    }

    public static String toNameString(int num) {
        StringBuilder tmp = new StringBuilder();
        String numStr = num + "";
        for (int i = 0; i < numStr.length(); i++) {
            tmp.append(names[numStr.charAt(i) - '0']);
            tmp.append(i < numStr.length() - 1 ? SEPERATOR  : "");
        }
        return tmp.toString();
    }

}
 
Zuletzt bearbeitet:

Neue Themen


Oben