数字と数値を互いに変換したい時は結構あります。今までもatoi、sscanf、sprintfなどを使うことにより出来ましたが、これらはC言語からの機能ということもあり、少しC++チックではありません。
そこで、C++11のstringではstring型のままで処理が可能な変換処理が実装されました。

#include <iostream>
#include <string>

using namespace std;

int main()
{
	//string⇒int型への変換
	cout << stoi("123") << endl;
	cout << stoi("-456") << endl;

	return 0;
}

stoi関数は第一引数にstring型を受け取り、そのstring型にある数字をint型の数値に変換して返します。
また、int型以外に変換する関数も用意されてます。

#include <iostream>
#include <string>

using namespace std;

int main()
{
	//string⇒int型への変換
	cout << stoi("2147483647") << endl;

	//string⇒long型への変換
	cout << stol("2147483647") << endl;

	//string⇒unsigned long型への変換
	cout << stoul("-1") << endl;

	//string⇒long long型への変換
	cout << stoll("9223372036854775807") << endl;

	//string⇒unsigned long long型への変換
	cout << stoull("-1") << endl;

	//string⇒float型への変換
	cout << stof("3.4E+38") << endl;

	//string⇒double型への変換
	cout << stod("1.7E+308") << endl;

	return 0;
}

ここで入れている文字列は、それぞれの型が表現出来る最大値になっています(unsigned系は面倒なので-1で表現)
また、浮動小数点系への変換部分にありますが、指数表現についても変換に対応しています。

この文字列⇒数値変換の関数には第一引数以外にも引数が用意されており、

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string str{"123N456"};
	size_t pos;

	//変換と同時に変換不可だった場所の取得
	cout << stoi(str, &pos) << endl;

	//変換不可能な場所があったらその文字を表示
	if(pos < str.size())
	{
		cout <<  str[pos] << endl;
	}

	//16進数から変換
	cout << stoi("0xFF", nullptr, 16) << endl;

	//8進数から変換
	cout << stoi("077", nullptr, 8) << endl;

	return 0;
}

第二引数は、変換出来なかった文字があった場合のその位置を返します(VS2013の場合ですが、全部変換出来た場合はその文字列の長さを返すようです)
第三引数は、その文字列を16進数または8進数などに指定します(VS2013ではこれがないと、「0xFF」では0のみが返ってくる)

次に、数値を文字列に変換する方法を紹介します。

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string str;

	//整数⇒文字列変換
	str = to_string(123);
	cout << str << endl;

	//浮動小数点数⇒文字列変換
	str = to_string(123.45);
	cout << str << endl;

	return 0;
}

to_string関数は、数値をstring型にしたもを返す関数です。使い方もシンプルで単純に引数に変換したい数値を渡すだけです。

紹介したstoi系、to_stringを組み合わせれば、外部ファイルとの読み書き時の数字⇒数字が楽になると思います(ただし、to_stringは16進数や指数表現などを10進数に修正した後変換するため、その形を保ったまま変換したい場合は自分で実装が必要)

前⇒続・C++11講座1回
次⇒続・C++11講座3回


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-12-14 (日) 12:12:15