Entwickler-Ecke
C# - Die Sprache - Convert.ToInt32(string[index]); - *grübel*
DerKleineImp - So 20.03.11 23:06
Titel: Convert.ToInt32(string[index]); - *grübel*
Hallöchen.
Das ist jetzt bestimmt ein ganz dummes Problem, aber ich komme nicht drauf.
Ich habe einen String.
C#-Quelltext
1:
| string Zahl = "123456"; |
Jetzt möchte ich das 3. Zeichen ("3") in eine Zahl umwandeln.
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...
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 - 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:
Was du aber eigentlich haben wolltest, ist ja:
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:
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:
C#-Quelltext
1:
| MessageBox.Show("Die 3. Ziffer lautet: " + int.Parse(Zahl[2].ToString())); |
Und siehe da: es funktioniert.
Grüße,
Yogu
DerKleineImp - 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:
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 - Mo 21.03.11 09:08
DerKleineImp hat folgendes geschrieben : |
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.
DerKleineImp hat folgendes geschrieben : |
PS: Das ganze war übrigens dazu gedacht, die Quersumme einer Zahl zu erhalten. Meine Methode sieht dazu so aus:
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 - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!