当前位置:  开发笔记 > 编程语言 > 正文

与地点无关的"atof"?

如何解决《与地点无关的"atof"?》经验,为你挑选了2个好方法。

我正在解析固定NMEA句子中的GPS状态条目,其中地理分钟的一小部分总是在一段时间之后.但是,在locale将逗号定义为小数分隔符的系统上,atof函数忽略句点和整数小数部分.

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

示例代码:

m_longitude = atof((char *)pField); 

哪里

pField[] = "01000.3897"; 

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

评论解决方案:

接受的答案更优雅,但这个答案(和评论)也值得快速解决



1> rjnilsson..:

你总是可以使用(模数错误检查):

#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到分钟(但我猜你已经知道了).


C++有一个直接引用C语言环境的函数:`std :: locale :: classic()`因此不需要通过`std :: locale("C")`进行临时创建.

2> MSalters..:

我曾经做过的一个讨厌的解决方案是sprintf()0.0f并从输出中获取第二个字符.然后在输入字符串中替换'.' 通过那个角色.这解决了逗号大小写,但如果区域设置定义了其他小数分隔符,也可以使用.


localeconv(在中)返回一个指向struct的指针,该decimal的decimal_point成员包含该值.请注意,指针有效直到下一个localeconv()或setlocale()
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有