将int转换为没有stringstream的Glib :: ustring

时间:2015-06-16 23:52:40

标签: c++ int glib

我需要将整数转换为Glib :: ustring,但我不想使用stringstream。并不是因为stringstream存在任何错误,但我不希望另一个库只是来完成这么简单的任务。

我的第一直觉是用一个大的'ol if语句编写一个函数,或者为每个数字使用一个字符数组,但必须有更清洁的东西。还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

Glib::ustring text = Glib::ustring::format(123456); 提供了一个format静态函数,它只是将你抛出的任何内容(最多8个参数,似乎没有可变参数模板)转发到字符串流并返回格式化字符串:

Glib::ustring text(std::to_string(123456));

从c ++ 11开始,标准库也有一个重载to_string方法来转换整数和浮点数

0=250
26000=0.86M
0=250|18000=300
0=250|18000=300|26000=0.86M

答案 1 :(得分:0)

编辑:此方法旨在完全避免STL,对于必要的案例/库。但是,无论如何,Glib :: ustring确实使用了STL,仅仅是FYI。如果您正在使用其他一些自定义字符串类,或者只是感觉像是一个带有Glib的智能aleck,这可能仍然会派上用场。

是的,它实际上是可能的,虽然它确实需要自定义功能。到目前为止,这非常有效,并且除了明显的Glib :: ustring之外不需要任何其他库。您可以替换任何其他支持char的字符串类,并相应地调整Glib :: ustring行。

Glib::ustring int_to_ustring(int num)
{
    bool neg = false;
    int sub = 0;
    char digit;
    //This is what we'll return.
    Glib::ustring str = "";

    //If number is 0, the math won't work. Just return the string "0".
    if(num == 0)
    {
        str = "0";
        return str;
    }
    //Else, if the number is negative...
    else if(num < 0)
    {
        //Store that information and make the number positive.
        neg = true;
        num = abs(num);
    }

    //Determine place value.
    int pv = 0;
    do
    {
        //Divide by a power of ten and trunicate decimal.
        sub = num / pow(10, pv);
        //Increase pv.
        pv++;
    }
    //If we got zero, then we're too large.
    while(sub != 0);

    //NOTE: The above seems to make the place value two-too-large?

    //Loop backwards through the place values.
    for(pv; pv >= 0; pv--)
    {
        sub = num / pow(10, pv);
        num -= sub*(pow(10, pv));

        if(sub < 0 || sub > 10)
        {
            //Throw an error. I'm just using this as a placeholder.
            std::cout << "Something went really weird." << std::endl;
        }

        //The char code for the digit is always 48 more than the digit.
        digit = sub + 48;
        //If this isn't a leading zero...
        if(!(str == "" && digit == '0'))
        {
            //This is the best way to push a char to a ustring.
            str.insert(str.end(), digit);
        }
    }

    //If that number was negative, insert the negative sign.
    if(neg)
        str.insert(str.begin(), '-');

    return str;
}

(顺便说一句,建议的改进是受欢迎的!我希望能提高效率。)