我在分析固定的NMEA句子中的GPS状态条目,其中地理分钟的分数部分总是在句号之后。然而,在语言环境将逗号定义为十进制分隔符的系统中,atof函数忽略周期和全分数部分。
处理这个问题的最佳方法是什么?存储在字符数组中的长/纬度字符串(如果重要的话)。
示例代码:
m_longitude = atof((char *)pField); 哪里
pField[] = "01000.3897"; 跨平台项目,为Windows和CE编译.
对解决方案的评论:
接受的答案更优雅,但是这的回答(和注释)也值得作为一个快速的解决方法来了解。
发布于 2009-08-26 10:59:15
您可以始终使用(模块化错误检查):
#include <sstream>
...
float longitude = 0.0f;
std::istringstream istr(pField);
istr >> longitude;标准的iostreams默认使用全局区域设置(反过来,应该将其初始化为经典的(US)区域设置)。因此,除非以前有人已经将全局区域设置更改为其他地方,否则上面的内容一般都会起作用,即使您是在非英语平台上运行。要确保使用了所需的区域设置,请创建特定的区域设置,并在读取该区域之前将该区域设置“注入”该流:
#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对应于分钟(但我猜你已经知道了)。
发布于 2009-08-26 09:47:56
我曾经做过的一个讨厌的解决方案是sprintf() 0.0f并从输出中获取第二个字符。然后在输入字符串中替换'.‘。通过那个角色。这解决了逗号的情况,但如果区域设置定义了其他十进制分隔符,则同样有效。
发布于 2009-08-26 09:50:58
为什么不能在atof之前执行赛特莱尔 "C“,然后恢复区域设置?也许我误解了这个问题..。
https://stackoverflow.com/questions/1333451
复制相似问题