Inhaltsverzeichnis
Werte in / aus Zeichenkette umwandeln
Es gibt Ideen, denen man nicht entrinnen kann.— Theodor Herzl
In jeder streng typisierten Programmiersprache steht man relativ bald vor einer der beiden Fragen:
- Wie kann man eine Zahl aus einer Zeichenkette lesen?
- Wie kann man eine Zahl in eine Zeichenkette umwandeln?
C++ 2011 definiert in <string> Konversionsfunktionen für ganze und Gleitkommazahlen.
std::string s = std::to_string(123.45); double d = std::stod(s); // 123.45 int i = std::stoi(s); // 123
(Unter MingGW 4.7.x sind diese mit einem inoffiziellen Patch nutzbar.)
Die Aufgabenstellung lässt sich auf beliebige Datentypen T
verallgemeinern (siehe auch boost::lexical_cast).
Die allgemeine Lösung in C++ setzt Ein-/Ausgabeoperatoren >>
und <<
für den betreffenden Datentyp T
voraus.
Gibt es (bisher) keine, sollten diese definiert werden.
Alternativ können eigene Spezialisierungen der Schablonen festgelegt werden
(was vom Arbeitsaufwand auf das Gleiche hinaus läuft).
Implementierung
- convert.h
//: convert.h : Umwandlung von / in string - R.Richter 2010-06-25 ///////////////////////////////////////////////////////////////// #ifndef CONVERT_H #define CONVERT_H #include <string> #include <sstream> #include <stdexcept> #include <typeinfo> namespace convert { template <typename T> std::string str(T const& x) { std::ostringstream os; os << x; return os.str(); } class error : public std::runtime_error { public: error(std::string const& why) : std::runtime_error(why) {} }; template <typename T> T to(std::string const& s) { std::istringstream is(s); T x; is >> x; if (!is) throw Error("Can't convert \'" + s + "\' to type " + typeid(T).name()); return x; } } // namespace convert #endif // CONVERT_H
Anwendung
#include <iostream> #include <string> #include "convert.h" void test() { int n = 42; std::string s = convert::str(n); double answer = convert::to<double>(s); if (n != answer) throw "conversion failed"; std::cout << answer << '\n'; int questionable = convert::to<int>(" 12Month"); // converts 12 int wrong = convert::to<int>("Hallo"); // throws convert::error }
Kann eine Zeichenkette nicht in den Zieldatentyp umgewandelt werden, wird eine Ausnahme geworfen:
int main() { try { test(); } catch(convert::error& e) { std::cerr << e.what() << '\n'; } catch(...) { std::cerr << "Fehler\n"; } return 0; }