首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >地点无关的"atof"?

地点无关的"atof"?
EN

Stack Overflow用户
提问于 2009-08-26 09:28:04
回答 7查看 17K关注 0票数 24

我在分析固定的NMEA句子中的GPS状态条目,其中地理分钟的分数部分总是在句号之后。然而,在语言环境将逗号定义为十进制分隔符的系统中,atof函数忽略周期和全分数部分。

处理这个问题的最佳方法是什么?存储在字符数组中的长/纬度字符串(如果重要的话)。

示例代码:

代码语言:javascript
复制
m_longitude = atof((char *)pField); 

哪里

代码语言:javascript
复制
pField[] = "01000.3897"; 

跨平台项目,为Windows和CE编译.

对解决方案的评论:

接受的答案更优雅,但是的回答(和注释)也值得作为一个快速的解决方法来了解。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-08-26 10:59:15

您可以始终使用(模块化错误检查):

代码语言:javascript
复制
#include <sstream>
...

float longitude = 0.0f;
std::istringstream istr(pField);

istr >> longitude;

标准的iostreams默认使用全局区域设置(反过来,应该将其初始化为经典的(US)区域设置)。因此,除非以前有人已经将全局区域设置更改为其他地方,否则上面的内容一般都会起作用,即使您是在非英语平台上运行。要确保使用了所需的区域设置,请创建特定的区域设置,并在读取该区域之前将该区域设置“注入”该流:

代码语言:javascript
复制
#include <sstream>
#include <locale>

...
float longitude = 0.0f;
std::istringstream istr(pField);

istr.imbue(std::locale("C"));
istr >> longitude;

另外,我通常使用正则表达式验证NMEA字段,提取字段的不同部分作为捕获,然后使用上述方法转换不同的部分。NMEA经度字段中小数点之前的部分实际上被格式化为“DDDMM.mmm.”DDD对应于学位,MM.mmm对应于分钟(但我猜你已经知道了)。

票数 19
EN

Stack Overflow用户

发布于 2009-08-26 09:47:56

我曾经做过的一个讨厌的解决方案是sprintf() 0.0f并从输出中获取第二个字符。然后在输入字符串中替换'.‘。通过那个角色。这解决了逗号的情况,但如果区域设置定义了其他十进制分隔符,则同样有效。

票数 7
EN

Stack Overflow用户

发布于 2009-08-26 09:50:58

为什么不能在atof之前执行赛特莱尔 "C“,然后恢复区域设置?也许我误解了这个问题..。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1333451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档