支持小数点和小数点逗号的字符串到浮点数转换
Posted
技术标签:
【中文标题】支持小数点和小数点逗号的字符串到浮点数转换【英文标题】:String to floating point conversion with support for both decimal point and decimal comma 【发布时间】:2012-02-27 08:42:10 【问题描述】:如果我希望逗号被解释为小数点逗号和点被解释为小数点,如何将字符串转换为浮点数?
代码会解析我们的客户创建的文本文件。他们有时使用小数点,有时使用小数逗号,但从不使用千位分隔符。
【问题讨论】:
您不能用逗号代替小数点作为预处理步骤吗? iostreams 中的本地化方面将是前进的方向,但祝你好运尝试找出它们...... 我同意 Nim,每当我这样做时,我只是在处理之前对输入数据进行标准化 【参考方案1】:使用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());
如果您需要处理数千个分隔符,那就更棘手了。
【讨论】:
【参考方案2】:只需搜索小数逗号','
并将其转换为'.'
,然后使用<cstdlib>
中的atof
:
#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
from <cstring>
来更改您的原始字符串(如果您之后需要原始版本,请不要忘记将其改回或使用语言环境副本) .
【讨论】:
小心使用这两个符号中的任何一个作为千位分隔符!根据您的输入,您可以将100.546,89
转换为100.546.89
,这不是一个合法数字。请务必检查
@Nick:我同意,但是 OP 已经声明“他们有时使用小数点,有时使用小数点逗号,但 从不使用千位分隔符”,因此不应出现此问题。 【参考方案3】:
如果您想将其作为std::istream
正常读取的一部分,您将创建一个自定义std::num_get<...>
构面,将其放入std::locale
对象中,然后使用imbue()
将其安装到您的流中(或通过在创建流之前将std::locale
设置为全局语言环境)。
【讨论】:
我可以在不从头开始编写自己的浮点解析器的情况下创建自定义 std::num_get<...> 方面吗? 嗯,是的,也不是。浮点解析的有趣部分是将字符串转换为double
。这例如strtod()
可以。但是,您需要将角色放在一起。这有点烦人,但并不难。以上是关于支持小数点和小数点逗号的字符串到浮点数转换的主要内容,如果未能解决你的问题,请参考以下文章
将十进制转换为小数点后两个零的字符串,和逗号? C# [重复]
C 语言 哪个函数可以把 浮点数转换成字符串 带小数点 怎么做