Autor Beitrag
DerKleineImp
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 17



BeitragVerfasst: So 20.03.11 23:06 
Hallöchen.

Das ist jetzt bestimmt ein ganz dummes Problem, aber ich komme nicht drauf.

Ich habe einen String.

ausblenden C#-Quelltext
1:
string Zahl = "123456";					


Jetzt möchte ich das 3. Zeichen ("3") in eine Zahl umwandeln.

ausblenden C#-Quelltext
1:
MessageBox.Show("Die 3. Ziffer lautet: "+Convert.ToInt32(Zahl[2]);					


Und die MessageBox sagt: "Die 3. Ziffer lautet: 54"

Sicherlich mache ich irgendetwas grundlegend falsch, denn...

ausblenden C#-Quelltext
1:
MessageBox.Show("Die 3. Ziffer lautet: "+Convert.ToInt32("3");					


...funktioniert wunderbar.
Ich wünschte, mein erster Thread in diesem Forum wäre intelligenter, aber ich hoffe, dass sich trotzdem jemand erbarmt. :)

Liebe Grüße,
Imp
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 20.03.11 23:20 
Der Unterschied zwischen den beiden Codebeispielen ist der, dass der Parameter einmal vom Typ char und einmal vom Typ string ist. Wenn du auf ein einzelnes Zeichen einer Zeichenkette zugreifst, bekommst du nämlich einen char. Als Konstante werden chars in einfache Auführungszeichen (also '3') geschrieben. Daher bekommst du zwei unterschiedliche Ergebnisse.

Ich rate von der Verwendung der Convert-Klasse ab. Alles, was diese Klasse kann, kann man auch anders schreiben und dabei die Absicht des Codes deutlicher kenntlich machen. Die Methode Convert.ToInt32(char) hat folgende Beschreibung:

MSDN über Convert.ToInt32(char) hat folgendes geschrieben:
Konvertiert den Wert des angegebenen Unicode-Zeichens in die entsprechende 32-Bit-Ganzzahl mit Vorzeichen.

Was du aber eigentlich haben wolltest, ist ja:

MSDN über int.Parse(string) hat folgendes geschrieben:
Konvertiert die Zeichenfolgendarstellung einer Zahl in die entsprechende 32-Bit-Ganzzahl mit Vorzeichen.

Und das ist die Methode int.Parse. Der Name sagt schon: Hier wird der Inhalt des Parameters geparst - also von der Textform in seine binäre Darstellung umgewandelt.

Also:

ausblenden C#-Quelltext
1:
MessageBox.Show("Die 3. Ziffer lautet: " + int.Parse(Zahl[2]));					

Na so was blödes, das ergibt ja einen Fehler. Zahl[2] ist vom Typ char, es wurde aber string erwartet. Immerhin haben wir jetzt aber eine Fehlermeldung und kein unerwartetes Ergebnis, also können wir reagieren und Zahl[2] in einen String umwandeln:

ausblenden C#-Quelltext
1:
MessageBox.Show("Die 3. Ziffer lautet: " + int.Parse(Zahl[2].ToString()));					

Und siehe da: es funktioniert.

Grüße,
Yogu
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 20.03.11 23:38 
Wobei man auch nicht vergessen sollte vorher zu prüfen, ob die Anzahl Zeichen ausreicht um auf das x-te Zeichen zuzugreifen. Außerdem gibt es statt Parse auch noch TryParse um keinen Fehler zu produzieren, falls der String gar keine Zahl enthält.
DerKleineImp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 17



BeitragVerfasst: Mo 21.03.11 01:06 
@Yogu
Oha, Grundlagen Datentypen: Setzen, 5. (6 wäre zu hart)

Warum rätst du denn von der Convert-Klasse ab? Kannst du das in eine allgemeine Aussage fassen?

Zitat:
Und siehe da: es funktioniert.


Und zwar tadellos, vielen Dank. Mit dem parsen werde ich mich näher beschäftigen müssen. :)

@jaenicke

Das mit dem x-ten zeichen ist kein Problem. Das läuft durch eine for-Schleife mit string.length als maximum.
TryParse ist sehr gut. An die Möglichkeit, dass der Input falsch ist, habe ich noch gar nicht gedacht, danke.

Achja, noch zu mir:
Ich lese das Galileo Openbook und bastel nebenbei schon in Visual C# 2010 Express rum. Im Buch komme ich gerade bei Kapitel 4 an.
Ist vielleicht suboptimal, aber nur das Buch durcharbeiten wäre arg langweilig.

Vielen Dank für eure Hilfe. :)

LG,
Imp

PS: Das ganze war übrigens dazu gedacht, die Quersumme einer Zahl zu erhalten. Meine Methode sieht dazu so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public int GetQuersumme(string txt)
{
    for (int i = 0; i < txt.Length; i++)
    {
        Quersumme += int.Parse(txt[i].ToString());
    }
    return Quersumme;
}
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 21.03.11 09:08 
user profile iconDerKleineImp hat folgendes geschrieben Zum zitierten Posting springen:
Warum rätst du denn von der Convert-Klasse ab? Kannst du das in eine allgemeine Aussage fassen?

In C# gibt es tolle Sprachmerkmale, um Konvertierungen durchzuführen. Die sind auch sehr gut durchdacht. Es gibt die impliziten Konvertierungen, die automatisch vonstatten gehen, z.B. von byte in int. Dabei gilt, dass die Daten vollständig erhalten bleiben und auch nicht in ein anderes Format, sondern nur in eine andere "Hülle" gebracht werden.

Bei expliziten Konvertierungen muss der Zieldatentyp mit angegeben werden (byte deinByte = (byte)deinInteger). Dabei gilt: Die Daten werden auch nur in eine andere Hülle gesteckt, es kann aber sein, dass sie zu groß oder zu klein für diese Hülle sind. Daher können hier auch Ausnahmen auftreten.

Und dann gibt es noch Konvertierungen, bei denen Daten in andere Formate umgewandelt werden. Dazu gehören String-zu-Integer und Integer-zu-String-Konvertierungen. Sie verwenden spezielle Methoden, wie zum Beispiel 123.ToString() oder int.Parse(deinInteger). Da bei letzterer Anweisung die Ausnahme FormatException geworfen werden könnte, gibt es noch TryParse bei der der Rückgabewert angibt, ob die Konvertierung erfolgreich war.

Du siehst also, dass Konvertierung nicht gleich Konvertierung ist und es sinnvoll ist, zu unterscheiden. Die Klasse Convert macht diese Unterscheidung nicht und es wird dabei auch nicht deutlich, wie genau konvertiert wird und ob eine Ausnahme geworfen werden könnte.

user profile iconDerKleineImp hat folgendes geschrieben Zum zitierten Posting springen:
PS: Das ganze war übrigens dazu gedacht, die Quersumme einer Zahl zu erhalten. Meine Methode sieht dazu so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public int GetQuersumme(string txt)
{
    for (int i = 0; i < txt.Length; i++)
    {
        Quersumme += int.Parse(txt[i].ToString());
    }
    return Quersumme;
}

Das könntest du mit ein wenig Mathematik auch ohne langsame String-Methoden machen. Kannst ja ein bisschen knobeln ;)
DerKleineImp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 17



BeitragVerfasst: Mo 21.03.11 11:43 
Danke, ich suche mir mal etwas Lektüre über das Konvertieren von Daten. Zu wissen, wann ich was und warum mache, ist wohl unerlässlich.

Zum Knobeln: Klar, ich gehe davon aus, dass wirklich jeder in einer Sekunde die Quersumme einer Zahl bilden kann, falls du das meinst.

Das "Projekt" ist ein klassisches Anfängerprojekt: Primzahlen testen. Vor dem eigentlichen Test, um das ganze schneller zu machen, prüfe ich u.a. ob die Quersumme der zu testenden Zahl % 3 == 0 ist. Ob das jetzt so sinnvoll ist? Naja, am Ende eher wenig.
Aber für wirklich sinnvolle Aufgaben habe ich später noch genug Zeit. Ich habe C# erst vor 3 Tagen für mich entdeckt *g* Im Moment dominiert noch der Spieltrieb über dem Drang, etwas sinnvolles zu machen. :)

LG,
Imp