如何在C ++中将数字转换为string,反之亦然
由于这个问题每周都会被问到,这个FAQ可能会帮助很多用户。
-
如何将整数转换为C ++中的string
-
如何将string转换为C ++中的整数
-
如何将浮点数转换为C ++中的string
-
如何将string转换为C ++中的浮点数
更新C ++ 11
从C++11
标准开始,string到数字的转换,反之亦然。 以下所有函数都存在于<string>
(按照第21.5节)。
string到数字
float stof(const string& str, size_t *idx = 0); double stod(const string& str, size_t *idx = 0); long double stold(const string& str, size_t *idx = 0); int stoi(const string& str, size_t *idx = 0, int base = 10); long stol(const string& str, size_t *idx = 0, int base = 10); unsigned long stoul(const string& str, size_t *idx = 0, int base = 10); long long stoll(const string& str, size_t *idx = 0, int base = 10); unsigned long long stoull(const string& str, size_t *idx = 0, int base = 10);
每一个都将一个string作为input,并尝试将其转换为数字。 如果不能构造有效的数字,例如因为没有数字数据,或者数字超出范围,则抛出exception( std::invalid_argument
或std::out_of_range
)。
如果转换成功并且idx
不为0
,则idx
将包含未用于解码的第一个字符的索引。 这可能是最后一个字符后面的索引。
最后,整数types允许指定一个基数,对于大于9的数字,假设字母表( a=10
直到z=35
)。 你可以在这里find更多关于浮点数 ,有符号整数和无符号整数的格式的信息。
最后,对于每个函数,还有一个接受std::wstring
的重载,因为它是第一个参数。
数字到string
string to_string(int val); string to_string(unsigned val); string to_string(long val); string to_string(unsigned long val); string to_string(long long val); string to_string(unsigned long long val); string to_string(float val); string to_string(double val); string to_string(long double val);
这些更直接,你传递适当的数字types,你会得到一个string。 对于格式化选项,您应该返回到C ++ 03stringstream选项并使用stream操作符,如其他答案中所述。
如注释中所述,这些函数回退到默认的尾数精度,可能不是最大的精度。 如果您的应用程序需要更高的精度,最好回到其他string格式化过程。
还有类似的函数被定义为to_wstring
,这些函数将返回一个std::wstring
。
如何将数字转换为C ++ 03中的string
- 不要使用
itoa
或itof
函数,因为它们是非标准的,因此不能移植。 -
使用stringstream
#include <sstream> //include this to use string streams #include <string> int main() { int number = 1234; std::ostringstream ostr; //output string stream ostr << number; //use the string stream just like cout, //except the stream prints not to stdout but to a string. std::string theNumberString = ostr.str(); //the str() function of the stream //returns the string. //now theNumberString is "1234" }
请注意,您也可以使用stringstream来将浮点数字转换为string,并且可以根据需要对string进行格式化,就像使用
cout
std::ostringstream ostr; float f = 1.2; int i = 3; ostr << f << " + " i << " = " << f + i; std::string s = ostr.str(); //now s is "1.2 + 3 = 4.2"
您可以使用stream操纵
std::setprecision()
,如std::endl
,std::hex
和函数std::setw()
,std::setprecision()
等与stringstream完全相同的方式与cout
不要将
std::ostringstream
与std::ostrstream
。 后者已被弃用 -
使用boost词法强制转换 。 如果您不熟悉boost,最好从像lexical_cast这样的小型库开始。 要下载并安装boost及其文档, 请点击这里 。 尽pipeboost并不是C ++标准,但很多boost的库最终得到了标准化,boost被广泛认为是最好的C ++库。
词法转换使用下面的stream,所以基本上这个选项和前一个一样,只是不那么冗长。
#include <boost/lexical_cast.hpp> #include <string> int main() { float f = 1.2; int i = 42; std::string sf = boost::lexical_cast<std::string>(f); //sf is "1.2" std::string si = boost::lexical_cast<std::string>(i); //sf is "42" }
如何将string转换为C ++中的数字03
-
从Cinheritance的最轻量级选项是函数
atoi
(用于整数(按字母到整数))和atof
(用于浮点值(按字母顺序排列))。 这些函数将一个C风格的string作为参数(const char *
),因此它们的用法可能被认为不是一个很好的C ++实践。 cplusplus.com在atoi和atof上都有简单易懂的文档,包括在input错误的情况下如何行事。 但是,如果input数字太大而不能适应目标types,则链接中会包含一个错误,该行为是不确定的。#include <cstdlib> //the standard C library header #include <string> int main() { std::string si = "12"; std::string sf = "1.2"; int i = atoi(si.c_str()); //the c_str() function "converts" double f = atof(sf.c_str()); //std::string to const char* }
-
使用stringstream(这次是inputstringstream,
istringstream
)。 同样,istringstream就像cin
一样使用。 再次,不要将istringstream
与istrstream
混淆。 后者已被弃用。#include <sstream> #include <string> int main() { std::string inputString = "1234 12.3 44"; std::istringstream istr(inputString); int i1, i2; float f; istr >> i1 >> f >> i2; //i1 is 1234, f is 12.3, i2 is 44 }
-
使用boost词法强制转换 。
#include <boost/lexical_cast.hpp> #include <string> int main() { std::string sf = "42.2"; std::string si = "42"; float f = boost::lexical_cast<float>(sf); //f is 42.2 int i = boost::lexical_cast<int>(si); //i is 42 }
在input错误的情况下,
lexical_cast
抛出boost::bad_lexical_cast
types的exception
我从StackOverflow的某个地方偷了这个convienent类来将任何stream式转换为string:
// make_string class make_string { public: template <typename T> make_string& operator<<( T const & val ) { buffer_ << val; return *this; } operator std::string() const { return buffer_.str(); } private: std::ostringstream buffer_; };
然后你用它作为;
string str = make_string() << 6 << 8 << "hello";
非常漂亮!
另外,我使用这个函数来将string转换为任何可以stream式传输的东西,如果你试图parsing一个不包含数字的string,它也不是很安全。 (也不像最后一个那么聪明)
// parse_string template <typename RETURN_TYPE, typename STRING_TYPE> RETURN_TYPE parse_string(const STRING_TYPE& str) { std::stringstream buf; buf << str; RETURN_TYPE val; buf >> val; return val; }
用于:
int x = parse_string<int>("78");
你可能也想要wstrings的版本。