不使用C/C++标准库实现的浮点数与字符串相互转换(最给力)

https://blog.csdn.net/paschen/article/details/74554955


C/C++标准库由于需要具有良好的通用性与全面性,使用了较为复杂的实现方法,实现的代码庞大


对于简单的Windows程序,使用C/C++标准库生成的EXE文件体积较大,整个程序80%以上代码可能均来源于标准库


一种可行的解决办法是使用C/C++动态库(MTd、MT),但这要求系统安装有相应版本的CRT


简单的程序往往功能要求不多、限制通常较少、无需考虑过多情况,使用C/C++标准库如同使用高射炮打蚊子


扫描二维码关注公众号,回复: 1476039 查看本文章

此时,一种更好的方法是架空C/C++标准库,直接使用Windows API (参看: C/C++程序减小可执行文件的大小


常用的标准库函数实现往往比较简单,但浮点数与字符串的转换则较为复杂,自己实现的代码往往无法周到全面地考虑各种情况


笔者通过对浮点数存储格式深入研究,并参考VS2015标准库相关代码,实现了不使用C/C++标准库浮点数与字符串相互转换的代码


代码考虑了字符串各种特殊情况:Inf、Nan、上溢、下溢等等,支持十六进制的浮点数字符串,运行效果与使用标准库完全相同


啰嗦了那么多,言归正传,直接给实现代码



头文件(浮点数转字符串与字符串转浮点数的函数接口):

[cpp]  view plain  copy
  1. /////////////////////////////////////////////////////////////////////////////  
  2. // DoubleConversion.h: header file  
  3. //  
  4. // DoubleConversion - Do not use CRT.  
  5. //  
  6. // Written by Paschen <[email protected]>  
  7. // Copyright (c) 2017. All Rights Reserved.  
  8. //  
  9. // This code may be used in compiled form in any way you desire. This  
  10. // file may be redistributed unmodified by any means PROVIDING it is  
  11. // not sold for profit without the authors written consent, and  
  12. // providing that this notice and the authors name and all copyright  
  13. // notices remains intact.  
  14. //  
  15. // An email letting me know how you are using it would be nice as well.  
  16. //  
  17. // This file is provided "as is" with no expressed or implied warranty.  
  18. // The author accepts no liability for any damage/loss of business that  
  19. // this product may cause.  
  20. //  
  21. /////////////////////////////////////////////////////////////////////////////  
  22.   
  23.   
  24. #ifndef DOUBLECONVERSION_H_H_H  
  25. #define DOUBLECONVERSION_H_H_H  
  26.   
  27. #include <Windows.h>  
  28.   
  29.   
  30.   
  31. //说明:  将double类型浮点数转换为字符串  
  32. //参数:  
  33. //       lpszBuffer: 转换结果缓冲区  
  34. //       value: 要转换的浮点数  
  35. //       FractionalDigitCount: 保留的小数位数  
  36. //返回值: 转换结果(字符串)  
  37. LPTSTR Double2String(LPTSTR lpszBuffer, double value, UINT32 FractionalDigitCount);  
  38.   
  39.   
  40.   
  41. //转换状态枚举  
  42. typedef enum  
  43. {  
  44.     SLD_OK,  
  45.     SLD_NODIGITS,  
  46.     SLD_UNDERFLOW,  
  47.     SLD_OVERFLOW  
  48. } SLD_STATUS;  
  49.   
  50.   
  51.   
  52. //说明:  将字符串转换为double类型浮点数  
  53. //参数:  
  54. //       lpszString: 要转换的字符串  
  55. //       result: 转换结果(double类型浮点数)  
  56. //返回值: 转换状态枚举  
  57. SLD_STATUS String2Double(LPCTSTR lpszString, double& result);  
  58.   
  59.   
  60. #endif  

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/80550118