当前位置:  开发笔记 > 编程语言 > 正文

如何在C++中将字符串转换为double?

如何解决《如何在C++中将字符串转换为double?》经验,为你挑选了5个好方法。

如何在C++中将字符串转换为double?我想要一个函数,当字符串不是数字时返回0.



1> Alessandro J..:

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

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

请注意,根据您的要求,您无法将所有允许的零字符串表示与非数字字符串区分开来.

 // the requested function
 #include 
 double string_to_double( const std::string& s )
 {
   std::istringstream i(s);
   double x;
   if (!(i >> x))
     return 0;
   return x;
 } 

 // some tests
 #include 
 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;
 }



2> Evgeny Lazin..:

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

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


@adam,在这种情况下,当my_string中存在非数字数据时,boost :: lexical_cast()抛出.只要my_string通常包含一个数字,那么我会说这符合_exceptional_条件.
不应将异常处理用于流量控制.例外情况适用于_exceptional_条件.
不幸的是,它看起来像"10.5xxxx".该字符串是否也会失败?还是应该返回10.5?

3> jmucchiello..:

atof和strtod做你想要的,但非常原谅.如果你不想接受像"32asd"这样的字符串有效,你需要在这样的函数中包装strtod:

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


请注意该代码接受空字符串:)(endptr == str ||*endptr)应修复它

4> Colin..:

如果它是一个c-string(以null为终结的char类型数组),你可以这样做:

#include 
char str[] = "3.14159";
double num = atof(str);

如果它是C++字符串,只需使用c_str()方法:

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

atof()会将字符串转换为double,失败时返回0.该功能记录在此处:http://www.cplusplus.com/reference/clibrary/cstdlib/atof.html



5> Bad..:
#include 
#include 
using namespace std;

int main()
{
    cout << stod("  99.999  ") << endl;
}

输出:(99.999为双精度,空格被自动剥离)

由于C ++ 11转换字符串浮点值(例如双)是可用的功能:
STOF -转换STR为float
STOD -转换STR为双
STOLD -转换STR为长双

我想要一个在字符串不是数字时返回0的函数。

您可以在stod引发异常时添加try catch语句。

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有