数字と数値を互いに変換したい時は結構あります。今までも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