DSP

高效的将整型类型转换为字符串的方法

2019-07-13 19:49发布

最近在项目中需要用到将数字转换为字符串,这里主要记录在使用过程中的一些思考。并且提供了一个较高效的转换实现。 说到如何将数字转换为字符串,我们可能先想到的是C函数库提供的snprintf等系列的函数或是C++库提供的功能更为强大的stringstream对象来进行转换。
没错C函数库提供的snprintf等系列函数非常的好用和方便。
例如:我们想要将一个int型的数值转换为对应的字符串。 #include #include using namespace std; int main(void) { //在VS2013中iValue = -2147483648会报错 int iValue = -2147483647 - 1; char arrBuffer[32]; //这里是在VC++进行编译,所以使用_snprintf。 _snprintf(arrBuffer, sizeof(arrBuffer), "%d", iValue); cout << arrBuffer << endl; return 0; } 结果正是我们想要的: -2147483648
C++库提供stringstream对象也能简单的完成这样的转换。 #include #include using namespace std; int main(void) { stringstream streamStr; int iValue = -2147483648; char arrBuffer[32]; streamStr << iValue; streamStr >> arrBuffer; cout << arrBuffer << endl; return 0; }输出如下: -2147483648使用起来相当的方便。不得不感叹stringstream的强大,安全,自动和直接。 下面我们来考虑使用snprintf或stringstream将数字转换为字符串的效率问题,在测试中我们关闭了优化选项,效率的测试在window(VS2013)上运行和Linux上面运行,在不同的机器上测试可能会有不同的表现。 先来看看用snprintf来执行数值转换的效率吧! #include #include #include using namespace std; int main(void) { time_t NewTime; time_t OldTime; char arrBuffer[32]; time(&OldTime); for (int i = -20000000; i <= 0; i++) //这里是在VC++进行编译,所以使用_snprintf。 _snprintf(arrBuffer, sizeof(arrBuffer), "%d", i); time(&NewTime); cout << arrBuffer << endl; cout << "time = " << NewTime - OldTime << endl; return 0; } 在Window上: 运行20000000次 8s 在Linux上: 运行40000000次 4s结果差距有点大。

再来看看使用stringstream进行转换吧! #include #include #include using namespace std; int main(void) { time_t NewTime; time_t OldTime; string strBuffer; time(&OldTime); for (int i = -20000000; i <= 0; i++) { stringstream streamStr; streamStr << i; streamStr >> strBuffer; } time(&NewTime); cout << strBuffer << endl; cout << "time = " << NewTime - OldTime << endl; return 0; }在Window上: 运行20000000次 274s 在Linux上: 运行40000000次 29s差距同样很大。 看上去效率还行,如果需要在高效点呢!ps:这里并不是评判snprintf或stringstream,相反我觉得非常的好用。只是snprintf或stringstream的功能强大,将数值转换为字符串只是它们的一小部分功能。 于是,就针对高效的将整型转换为字符串进行思考。下面给出第一次的实现: #include #include #include using namespace std; const char NumTab[] = {"9876543210123456789"}; template int NumberToString(char arrBuffer[], T value) { int iRemainder; T TmpValue = value; char *pTmp = arrBuffer; const char *pNumTab = &NumTab[9]; do { iRemainder = static_cast(TmpValue % 10); *pTmp++ = pNumTab[iRemainder]; TmpValue /= 10; }while(TmpValue != 0); if(value < 0) *pTmp++ = '-'; *pTmp = '