[C#] StringToInt funktioniert nicht...

  • Hey,


    ich versuche in C# eine Funktion zu schreiben, die einen String in eine Zahl umkonvertiert.
    Also wie in PAWN das strval(string[]); .. Aber der gibt mir eine Falsche Zahl nun aus.
    Hier die Funktion:



    Anwendung:

    C
    int number = StringToInt("9050158537125488");
                    	MessageBox.Show(number+"");


    Ausgabe: 63450


  • So müsste es eigentlich gehen. Ist ungetestet.


    Ich wandle hier einfach den Buchstaben in den ASCII Code um.


    Kostenlose Pawno Alternative / PAWN IDE -> PawnStar
    Mass Effect
    :love:

  • Hey, ich habe in der Schule ein Programm geschrieben, welches aus
    einem String alle Zahlen rausnimmt.
    Vielleicht hilft dir das ;)


    Spoiler anzeigen
    namespace numextractor
    {
    class Program
    {
    static void Main(string[] args)
    {
    string input = "";
    long zahl = 0;
    Console.WriteLine(" == Number - Extractor == ");
    Console.WriteLine(" Bitte beliebige Zeichenkombination eingeben");
    input = Console.ReadLine();
    input.ToUpper();
    Console.WriteLine();
    for (int i = 0; i < input.Length; i++)
    {
    if ('0' <= input[i] && input[i] <= '9')
    {
    zahl = (zahl * 10) + input[i] - '0';
    }
    }
    Console.WriteLine("Die Zahl lautet {0}, das doppelte {1}", zahl,zahl*2);
    Console.ReadKey();
    }
    }
    }

  • Ich bin zwar kein C#-Programmierer, ein paar C++ Kentnisse habe ich jedoch. Beim Anschauen des Sourcecodes sind mir 3 Probleme aufgefallen WENN du es mit dem System machen möchtest, dass du in deinem Sourcecode verwendest:


    1. Du gehst den String von vorne nach hinten durch. Das ist falsch rum, da beispielsweise in der Zahl "15" die "1" mit 10 und die "5" mit 1 multipliziert werden müssten. Du musst also den String von rechts nach links durchgehen, so, wie auch unsere Zahlen aufgebaut sind.
    2. Die for-Schleife geht von 0 los. Die erste Stelle von rechts muss aber mit 1 multipliziert werden, da sonst an der Stelle immer 0 addiert wird und nicht die richtige Ziffer. Du müsstest somit an der Stelle eine If-Abfrage einbauen, die, wenn i 0 ist, mit 1 multipliziert Siehe Punkt 4
    3. Du multiplizierst den Char mit 1, 10, 20. Der Char hat aber, wenn es der Buchstabe '0' ist, nicht den Wert null, sondern einen anderen (Im ASCII-Zeichensatz z.B. 48). Somit müsstest du zu erst den Wert von '0' davon abziehen und ihn dann mit 1, 10 usw. multiplizieren.
    4. von Drasko: Du multiplizierst 10 mit 1, 2, 3 usw. Du musst es aber potenzieren, damit du nicht auf 10, 20, 30 usw. kommst, sonder auf 10, 100, 1000 usw. Damit ist dann auch Punkt 2. gelöst, da 10^0 1 ist.


    All diese Probleme hat der oben genannte Code nicht, da er leicht anders funktioniert und damit auch gleichzeitig effektiver und einfacher ist.


    Edit: Mit oben genannt meine ich den von Changer, in Draskos Code wurden die Probleme nicht beseitigt, er hat nur die Chars durch ihre Int-Werte ersetzt, was aber eigentlich unnötig ist.
    Edit2: Punkt 4 von Drasko eingeführt.
    Edit3: An alle: Er möchte seine Kenntnisse verbessern. Ich denke nicht, dass es ihm hilft, wenn ihm hier fertiger Source-Code präsentiert wird. Ich denke, solchen Leute sollte lieber beigebracht kriegen, wie man Programme richtig debuggt und Fehlerquellen findet.
    Somit mein Tipp: Wenn man den Code einmal im Kopf durchgeht oder das Programm mithilfe von Konsolenausgaben den Effekt jeder Zeile anzeigen lässt, dann lassen sich alle Fehler ganz leicht identifizieren. Du solltest daher bei solchen Problemen erst probieren, den Fehlerpunkt einzugrenzen (hier gibt es leider mehrere) und selber eine Lösung dafür zu suchen, da es sonst sehr anstrengen werden kann, größere Programme zu schreiben ;).

    5 Mal editiert, zuletzt von oernqsvfu_fgvaxg ()

  • Sharpadox:
    Also.
    Du musst auf jeden Fall den String von hinten nach vorne durchgehen. Außerdem musst du zehn potenzieren und nicht mal nehmen.


    Ich saß jetzt locker 30 Minuten und hab probiert. Morgen schau ich nochmal.


    //EDIT:
    So mit einer weiteren Hilfsmethode hab' ich es gelöst:


    Da testbereiter Code:


    Kostenlose Pawno Alternative / PAWN IDE -> PawnStar
    Mass Effect
    :love:

    Einmal editiert, zuletzt von Drasko ()

  • Spoiler anzeigen

    Da testbereiter Code:



    Somit wird daraus:


    Wenn ich mich da nicht irgendwo vertippt habe - ist ungetestet.
    Edit: Getestet, funktioniert

    Einmal editiert, zuletzt von oernqsvfu_fgvaxg ()

  • Ich find die Variante irgendwie ganz nett:
    int num = 0;
    while(!int.TryParse(Console.ReadLine(), out num)) {
    Console.WriteLine("Falsche Angabe!");
    }
    Ist aber auch eine fertige Methode "TryParse()".