我在下面的函数中发现了一个错误。当temp = 10时,它会将temp转换为字符串'01'。而不是字符串'10'。我不知道为什么? 有没有更好的将Num转换为Str?感谢。
完成了Num2Str(),
static bool Num2Str(string& s, const T& value)
{
int temp = static_cast<int>(value); // When temp = 10.
s.push_back(char('0' + temp % 10));
temp /= 10;
while(temp != 0)
{
s.push_back(char('0' + temp % 10));
temp /= 10;
}
if(s.size() == 0)
{
return false;
}
if(s.find_first_not_of("0123456789") != string::npos)
{
return false;
}
return true;
}
答案 0 :(得分:3)
使用std::ostringstream
将数字转换为字符串。
不要在C ++中使用自由静态函数;改为使用未命名的命名空间。
#include<sstream>
#include<string>
namespace {
void f()
{
int value = 42;
std::ostringstream ss;
if( ss << value ) {
std::string s = ss.str();
} else {
// failure
}
}
}
答案 1 :(得分:1)
对于现有代码风格的解决方案(虽然我更喜欢现有的内置int到字符串转换):
template<class T>
static std::string Num2Str(const T& value)
{
std::string s;
int temp = static_cast<int>(value);
if (!temp)
{
s = "0";
return s;
}
while(temp != 0)
{
s.insert(0,1,(char('0' + temp % 10)));
temp /= 10;
}
return s;
}
需要添加对负值,范围检查等的支持。
答案 2 :(得分:1)
我最喜欢的是递归版本(主要是在C中),用于将数字翻转到正确的顺序。
void u2str(string& s, unsigned value){
unsigned d = value % 10;
value /= 10;
if (value > 0 )
u2str(s,value);
s.push_back('0'+d);
}
对于0,您得到“0”,但在所有其他情况下,您不会得到前导零。如图所示,它假设字符串比插入更有效。但是,如果插入是,那么你不需要递归技巧(例如Keith的回答)。
答案 3 :(得分:1)
你也可以使用boost :: lexical_cast(见http://www.boost.org/doc/libs/1_46_1/libs/conversion/lexical_cast.htm)
例如:
void log_message(const std::string &);
void log_errno(int yoko)
{
log_message("Error " + boost::lexical_cast<std::string>(yoko) + ": " + strerror(yoko));
}