如果我想将两个逗号解释为十进制逗号并将点解释为小数点,如何将字符串转换为浮点数?字符串到浮点转换,支持小数点和小数点逗号
该代码分析我们的客户创建的文本文件。他们有时使用小数点,有时使用小数点逗号,但不使用千位分隔符。
如果我想将两个逗号解释为十进制逗号并将点解释为小数点,如何将字符串转换为浮点数?字符串到浮点转换,支持小数点和小数点逗号
该代码分析我们的客户创建的文本文件。他们有时使用小数点,有时使用小数点逗号,但不使用千位分隔符。
使用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());
}
如果你需要应付千位分隔符它会更加棘手。
只要搜索小数逗号','
并将其转换为一个'.'
,然后用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>
更改原始的字符串(如果您之后需要原始版本,请不要忘记将其更改或在区域设置副本上工作)。
如果你想这样做,作为一个std::istream
的正常阅读,你会创建一个自定义std::num_get<...>
小的一部分,把它变成一个std::locale
对象,并使用imbue()
安装到您的流(或通过设置std::locale
作为创建流之前的全局区域设置)。
我可以创建自定义std :: num_get <...>方面而无需从头开始编写自己的浮点解析器? – user763305 2012-02-27 10:10:31
嗯,是的,没有。浮点解析的一个有趣的部分是将一个字符串转换成一个'double'。例如, 'strtod()'可以做。不过,你必须把这些角色放在一起。这有点烦人,但并不难。 – 2012-02-27 11:08:56
您不能用小数点替代逗号作为预处理步骤吗? iostreams中的本地化方面将是前进的方向,但祝你好运,试图找出它们...... – Nim 2012-02-27 08:45:00
我同意Nim,每当我这样做时,我只是在处理之前对输入数据进行规范化 – 2012-02-27 08:55:03