如果我想将逗号解释为十进制逗号并将点解释为小数点,如何将字符串转换为浮点数?
代码解析由客户创建的文本文件。它们有时使用小数点,有时使用小数点逗号,但从不使用千位分隔符。
答案 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}}设置为全局区域设置)。