String nach Zahl



  • Hallo,

    es ist mir ja etwas peinlich, weil das wohl eine der am häufigsten gestellten Fragen ist. Allerdings werde ich aus dem FAQ-eintrag nicht schlau.

    Ich habe einen String:

    std::string number = "87687687";
    

    Jetzt möchte ich gerne eine beliebige Stelle dieses Strings in eine Zahl umwandeln, um damit rechnen zu können. Ich verstehe leider nicht, wie ich das bewerkstelligen kann.

    Wär nett, wenn mir da gerade mal jemand auf die Sprünge helfen könnte.

    Gruß, mbu.



  • Suche in der FAQ.



  • eine beliebige stelle im string definierst du wodurch? ein zeichen? ein substring?

    bei einem einzelnen zeichen geht das so:

    string x = "012345";
    
    int i = x[3] - '0';
    //i == 3
    

    substrings siehe FAQ (stringstream)



  • mbu schrieb:

    Allerdings werde ich aus dem FAQ-eintrag nicht schlau.

    simon.gysi schrieb:

    Suche in der FAQ.

    Vielen Dank auch.



  • @queer_boy: Vielen Dank. Das war genau das was ich brauchte. 👍



  • queer_boy schrieb:

    ...
    bei einem einzelnen zeichen geht das so

    string x = "012345";
    
    int i = x[3] - '0';
    //i == 3
    

    ...

    Geht zwar schon ... aber ziemlich in die Hose, wenn man sich auf einer entsprechenden Maschine befindet (zumal ja in x[3] nichtmal eine Ziffer drin sein muss). 😉
    Wenn, dann würde ich immer mit "Umsetzungstabellen" arbeiten .. bei 10 Ziffern tut's auch ein switch:

    int char2Int(char c) {
          switch(c) {
          case '0': return 0;
          case '1': return 1;
          case '2': return 2;
          case '3': return 3;
          case '4': return 4;
          case '5': return 5;
          case '6': return 6;
          case '7': return 7;
          case '8': return 8;
          case '9': return 9;
       }
       throw std::runtime_error("Ungültiges Zeichen");
    }
    
    string x = "012345";
    int i = char2Int(x[3]);
    

    ist auch nicht aufwendiger und dafür portabel (und auf andere Zeichensätze zu erweitern).

    Insgesamt bin ich allerdings skeptisch, wie wertvoll diese "Zeichenweise Umsetzung" ist.

    Gruß,

    Simon2.



  • ...L O L...



  • Sorry, Simon, aber diesmal muß ich dir widersprechen.
    Vom C und vom C++ Standard ist definiert, daß die Ziffern '0' - '9' fortlaufend im Zeichensatz vorkommen müssen (im Gegensatz zum Alphabet, wo man korrekterweise nicht davon ausgehen sollte: ASCII <-> EBSDIC): die Standard-Funktionen atoi(), atof(), ... nutzen dies auch intern.

    Und die Abfrage, ob überhaupt eine Ziffer vorliegt, kann man ja bequem mit 'isdigit()' durchführen.



  • string x = "012345";
    
    int i = x[3] - '0';
    //i == 3
    

    Vielleicht könnte man diesen Code als eine weitere Möglichkeit für die Frage "String nach Zahl" in die FAQ aufnehmen? Ist für diesen Fall nämlich sehr viel kürzer, als irgendwie mit std::stringstream zu arbeiten.



  • Hallo

    Deine Umwandlung ist char in Ziffer. Du siehst sicher ein das das etwas anderes ist als string in Zahl.

    bis bald
    akari



  • Th schrieb:

    ...Vom C und vom C++ Standard ist definiert, daß die Ziffern '0' - '9' fortlaufend im Zeichensatz vorkommen müssen ...

    Echt ?

    Nunja, dann habe ich das bislang nicht gefunden und bin dankbar für diese Aufklärung. Zwar kenne ich keinen Zeichensatz, bei dem das nicht so wäre, aber ich finde es schon sehr verwunderlich, dass der C++-Standard das festlegen kann.
    Ist er dann auf Plattformen, die das nicht anbieten, nicht umsetzbar ? Oder bekommt er einen "eigenen Zeichensatz" ?

    Letztlich bleibt aber immer noch, dass es spätestens bei Hex-Daten nicht mehr klappt.

    Gruß,

    Simon2.



  • Hi Simon2,

    habe mal gerade in dem Draft-Dokument des C++ Standards geschaut (bzw. gesucht).

    2.2 Character sets

    3
    ...
    In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
    ...

    Ich weiß, dies ist gut versteckt...



  • Klingt wie nach dem Countdown der heiligen Handgranate bei Ritter der Kokosnuss. 😉



  • Simon2 schrieb:

    Ist er dann auf Plattformen, die das nicht anbieten, nicht umsetzbar ? Oder bekommt er einen "eigenen Zeichensatz" ?

    Hem, ist ja nur bei der Ausgabe (Bildschirm, Datei usw.) wichtig, das es korrekt umgewandelt wird. Also ist das Sache der Runtime. Kostet dann halt evtl. Performance. Wo ein Wille, da ein Weg. 😉


Log in to reply