C++11で数字→文字列はstd::to_string()、文字列→数字はstd::stoi()とかstd::stod()とか


このエントリーをはてなブックマークに追加

数字から文字列

スクリプト言語でよくある、数字を文字列に変換する関数がC++11でも提供されています。std::to_string(100)などと書くだけで数字が文字列に変換できます。

#include <iostream>
#include <string>

int main() {
    std::string str = "Holland, " + std::to_string(1945);
    std::cout << str << std::endl;
    return 0;
}

ただし変換方法はおまかせで高度なフォーマット指定はできません(たぶん)。フォーマットを指定したい場合は、Cの流儀でsprintf()関数を使うか、C++の流儀でstd::ostringstreamを使います。以下は、数字777を、"00777"と0埋め5桁の文字列に変換する例です。(参考:C++ の iostream フォーマット指定早見表

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

int main() {
    int i = 777;
    std::ostringstream sout;
    sout << std::setfill('0') << std::setw(5) << i;
    std::string s = sout.str();
    std::cout << s << std::endl;

    return 0;
}

文字列から数字

文字列から数字に変換するにはstd::stoi()とかstd::stod()とかのシリーズを使います。stoi()は"string to int"、つまり整数型intに変換するという意味です。同様にstod()はdouble型に変換するという意味です。

以下は整数への変換例です。

#include <iostream>
#include <string>

int main() {
    int year = std::stoi("1945");
    return 0;
}

他のシリーズはstoi (C++11) - cpprefjp - C++ Library Referenceに載っています。

それにしてもto_string()とstoi()という名前の非対称性、どうにかならなかったんでしょうか。

動作確認

Visual Studio 2013で動作を確認しました。Cygwin + g++ 4.8.2ではなぜかエラーでコンパイルできませんでした。バグらしいですが深追いしていません。