namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:convert_from_to_string

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).

Modul

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

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;
}
howto/convert_from_to_string.txt · Zuletzt geändert: 2013-03-17 12:44 (Externe Bearbeitung)