如何将string转换为C ++中的double?

如何将string转换为C ++中的double? 我想要一个函数,当string不是数字时返回0。

请参阅C ++ FAQ Lite 如何将std :: string转换为数字?

请参阅C ++超常见问题解答如何将std :: string转换为数字?

请注意,根据您的要求,您不能从非数字string中区分所有允许的string表示。

// the requested function #include <sstream> double string_to_double( const std::string& s ) { std::istringstream i(s); double x; if (!(i >> x)) return 0; return x; } // some tests #include <cassert> int main( int, char** ) { // simple case: assert( 0.5 == string_to_double( "0.5" ) ); // blank space: assert( 0.5 == string_to_double( "0.5 " ) ); assert( 0.5 == string_to_double( " 0.5" ) ); // trailing non digit characters: assert( 0.5 == string_to_double( "0.5a" ) ); // note that with your requirements you can't distinguish // all the the allowed string representation of zero from // the non numerical strings: assert( 0 == string_to_double( "0" ) ); assert( 0 == string_to_double( "0." ) ); assert( 0 == string_to_double( "0.0" ) ); assert( 0 == string_to_double( "0.00" ) ); assert( 0 == string_to_double( "0.0e0" ) ); assert( 0 == string_to_double( "0.0e-0" ) ); assert( 0 == string_to_double( "0.0e+0" ) ); assert( 0 == string_to_double( "+0" ) ); assert( 0 == string_to_double( "+0." ) ); assert( 0 == string_to_double( "+0.0" ) ); assert( 0 == string_to_double( "+0.00" ) ); assert( 0 == string_to_double( "+0.0e0" ) ); assert( 0 == string_to_double( "+0.0e-0" ) ); assert( 0 == string_to_double( "+0.0e+0" ) ); assert( 0 == string_to_double( "-0" ) ); assert( 0 == string_to_double( "-0." ) ); assert( 0 == string_to_double( "-0.0" ) ); assert( 0 == string_to_double( "-0.00" ) ); assert( 0 == string_to_double( "-0.0e0" ) ); assert( 0 == string_to_double( "-0.0e-0" ) ); assert( 0 == string_to_double( "-0.0e+0" ) ); assert( 0 == string_to_double( "foobar" ) ); return 0; } 

最简单的方法是使用boost :: lexical_cast :

 double value; try { value = boost::lexical_cast<double>(my_string); } catch (boost::bad_lexical_cast const&) { value = 0; } 

atof和strtod做你想要的,但是非常宽容。 如果你不想接受像“32asd”这样的string作为有效的,你需要将strtod包装在如下的函数中:

 #include <stdlib.h> double strict_str2double(char* str) { char* endptr; double value = strtod(str, &endptr); if (*endptr) return 0; return value; } 

如果它是一个cstring(chartypes的以null结尾的数组),那么可以这样做:

 #include <stdlib.h> char str[] = "3.14159"; double num = atof(str); 

如果它是一个C ++string,只需使用c_str()方法:

 double num = atof( cppstr.c_str() ); 

atof()会将string转换为double,失败时返回0。 该functionlogging在这里: http : //www.cplusplus.com/reference/clibrary/cstdlib/atof.html

 #include <iostream> #include <string> using namespace std; int main() { cout << stod(" 99.999 ") << endl; } 

输出: 99.999 (这是双倍的,空白被自动剥离)

由于C ++ 11将string转换为浮点值(如double)可用于函数:
stof – 将str转换为float
stod – 将str转换为double
stold – 把str转换成一个long double

我想要一个函数,当string不是数字时返回0。

stod抛出exception时,您可以添加try catch语句。

必须说我同意最优雅的解决scheme是使用boost :: lexical_cast。 然后,您可以捕获可能发生的bad_lexical_cast,并在失败时执行某些操作,而不是获取所赋予的0.0。

 #include <boost/lexical_cast.hpp> #include <string> int main() { std::string str = "3.14"; double strVal; try { strVal = boost::lexical_cast<double>(str); } catch(bad_lexical_cast&) { //Do your errormagic } return 0; } 

这个问题最优雅的解决scheme之一是使用boost :: lexical_cast作为@Evgeny Lazin提到。

我认为atof正是你想要的。 这个函数parsing一个string并把它转换成一个double。 如果string不以数字开头(非数字),则返回0.0。

然而,它试图尽可能多地parsingstring。 换句话说,string“3abc”将被解释为3.0。 如果你想在这些情况下返回0.0的函数,你将需要自己写一个小包装。

另外,这个函数可以和空string的C风格的string一起工作。 如果您使用的是string对象,则在使用此函数之前,需要将其转换为char *。

没有一个函数可以这样做,因为0是一个有效的数字,当string不是有效的数字时,你需要能够捕获它。

您需要首先检查string(可能是正则expression式),看它是否只包含数字和数字标点符号。 然后,您可以决定返回0,如果这是您的应用程序需要或将其转换为双。

在查看atof()strtod()后,我应该把我的陈述改为“不应该有”而不是“不存在”…嘿嘿