在Dissection C ++ number 2字符串函数方面需要帮助

时间:2011-03-18 02:32:55

标签: c++ function typeconverter

我在下面的函数中发现了一个错误。当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;
}

4 个答案:

答案 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));
}