2012-02-27 90 views
4

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

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

+3

您不能用小数点替代逗号作为预处理步骤吗? iostreams中的本地化方面将是前进的方向,但祝你好运,试图找出它们...... – Nim 2012-02-27 08:45:00

+0

我同意Nim,每当我这样做时,我只是在处理之前对输入数据进行规范化 – 2012-02-27 08:55:03

回答

8

使用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()); 
} 

如果你需要应付千位分隔符它会更加棘手。

3

只要搜索小数逗号','并将其转换为一个'.',然后用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使用strchr<cstring>更改原始的字符串(如果您之后需要原始版本,请不要忘记将其更改或在区域设置副本上工作)。

+0

要小心两个符号中的任何一个虽然用作千位分隔符!根据您的输入,您可以将“100.546,89”转换为“100.546.89”,这不是合法号码。一定要检查 – Nick 2012-02-27 09:02:17

+1

@Nick:我同意,但是OP已经声明“他们有时使用小数点,有时使用小数点逗号,但是从未使用千分隔符”,所以不应该发生这个问题。 – Zeta 2012-02-27 09:22:56

0

如果你想这样做,作为一个std::istream的正常阅读,你会创建一个自定义std::num_get<...>小的一部分,把它变成一个std::locale对象,并使用imbue()安装到您的流(或通过设置std::locale作为创建流之前的全局区域设置)。

+0

我可以创建自定义std :: num_get <...>方面而无需从头开始编写自己的浮点解析器? – user763305 2012-02-27 10:10:31

+0

嗯,是的,没有。浮点解析的一个有趣的部分是将一个字符串转换成一个'double'。例如, 'strtod()'可以做。不过,你必须把这些角色放在一起。这有点烦人,但并不难。 – 2012-02-27 11:08:56

相关问题