namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:convert_from_to_string

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

howto:convert_from_to_string [2013-03-17 12:44] (aktuell)
Zeile 1: Zeile 1:
 +====== 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 [[..:​kennen:​include:​string]] Konversionsfunktionen für ganze und Gleitkommazahlen.
 +<code cpp>
 +  std::string s = std::​to_string(123.45);​
 +  double d = std::​stod(s);​ // 123.45
 +  int i    = std::​stoi(s);​ // 123
 +</​code>​
 +(Unter MingGW 4.7.x sind diese mit einem [[http://​tehsausage.com/​mingw-to-string|inoffiziellen Patch]] nutzbar.)
 +
 +Die Aufgabenstellung lässt sich auf beliebige Datentypen ''​T''​ verallgemeinern (siehe auch [[http://​www.boost.org/​doc/​libs/​1_53_0/​doc/​html/​boost_lexical_cast.html|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).
 +===== Modul =====
 +<code cpp 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(const T& x)
 +  {
 +    std::​ostringstream os;
 +    os << x;
 +    return os.str();
 +  }
 +
 +  class error : public std::​runtime_error
 +  {
 +  public:
 +    error(const std::​string&​ why) : std::​runtime_error(why) {}
 +  };
 +  ​
 +  template <​typename T>
 +  T to(const std::​string&​ 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
 +</​code>​
 +===== Anwendung =====
 +<code cpp>
 +#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
 +}
 +</​code>​
 +Kann eine Zeichenkette nicht in den Zieldatentyp umgewandelt werden,
 +wird eine Ausnahme geworfen: ​
 +<code cpp>
 +int main()
 +{
 +  try
 +  {
 +    test();
 +  }
 +  catch(convert::​error&​ e)
 +  {
 +    std::cerr << e.what() << '​\n';​
 +  }
 +  catch(...)
 +  {
 +    std::cerr << "​Fehler\n";​
 +  }
 +  return 0;
 +}
 +</​code>​
 +
  
howto/convert_from_to_string.txt · Zuletzt geändert: 2013-03-17 12:44 (Externe Bearbeitung)