我正在解析固定NMEA句子中的GPS状态条目,其中地理分钟的一小部分总是在一段时间之后.但是,在locale将逗号定义为小数分隔符的系统上,atof函数忽略句点和整数小数部分.
处理这个问题的最佳方法是什么?存储在字符数组中的长/纬度字符串,如果重要的话.
示例代码:
m_longitude = atof((char *)pField);
哪里
pField[] = "01000.3897";
跨平台项目,为Windows XP和CE编译.
评论解决方案:
接受的答案更优雅,但这个答案(和评论)也值得快速解决
你总是可以使用(模数错误检查):
#include... float longitude = 0.0f; std::istringstream istr(pField); istr >> longitude;
标准iostream默认使用全局语言环境(反过来应该初始化为经典(美国)语言环境).因此,除非有人以前将全局语言环境更改为其他内容,否则上述内容应该可以正常工作,即使您在非英语平台上运行也是如此.要确保使用所需的语言环境,请创建一个特定的语言环境,并在读取之前使用该语言环境"填充"该流:
#include#include ... float longitude = 0.0f; std::istringstream istr(pField); istr.imbue(std::locale("C")); istr >> longitude;
作为旁注,我通常使用正则表达式来验证NMEA字段,将字段的不同部分提取为捕获,然后使用上述方法转换不同的部分.NMEA经度字段中小数点前面的部分实际上格式化为"DDDMM.mmm ..",其中DDD对应度数,MM.mmm到分钟(但我猜你已经知道了).
我曾经做过的一个讨厌的解决方案是sprintf()
0.0f并从输出中获取第二个字符.然后在输入字符串中替换'.' 通过那个角色.这解决了逗号大小写,但如果区域设置定义了其他小数分隔符,也可以使用.