字符串到浮点转换,支持小数点和小数点逗号

时间:2012-02-27 08:42:10

标签: c++

如果我想将逗号解释为十进制逗号并将点解释为小数点,如何将字符串转换为浮点数?

代码解析由客户创建的文本文件。它们有时使用小数点,有时使用小数点逗号,但从不使用千位分隔符。

3 个答案:

答案 0 :(得分:9)

使用std::replace进行艰苦的工作:

#include <cstdlib>
#include <string>
#include <algorithm>

double toDouble(std::string s){
    std::replace(s.begin(), s.end(), ',', '.');
    return std::atof(s.c_str());
}

如果你需要应对数以千计的分隔符,那就更加棘手了。

答案 1 :(得分:4)

只需搜索小数点逗号','并将其转换为'.',然后使用atof中的<cstdlib>

#include <cstdlib>
#include <cstdio>
#include <string>

double toDouble(std::string s){
    // do not use a reference, since we're going to modify this string
    // If you do not care about ',' or '.' in your string use a 
    // reference instead.
    size_t found = s.find(",");
    if(found != std::string::npos)
        s[found]='.'; // Change ',' to '.'
    return std::atof(s.c_str());
}

int main(){
    std::string aStr("0.012");
    std::string bStr("0,012");

    double aDbl = toDouble(aStr);
    double bDbl = toDouble(bStr);

    std::printf("%lf %lf\n",aDbl,bDbl);
    return 0;    
}

如果您使用C字符串代替std::string,请使用<cstring>中的strchr来更改原始字符串(如果您使用,请不要忘记将其更改回来或使用区域设置副本之后需要原版。)

答案 2 :(得分:0)

如果您想在正常阅读std::istream时进行此操作,则可以创建自定义std::num_get<...>方面,将其放入std::locale对象,并将其安装到您的imbue()对象中使用std::locale进行流式处理(或者在创建流之前将{{1}}设置为全局区域设置)。