2015-06-16 69 views
0

我需要將整數轉換爲Glib :: ustring,但我不想使用stringstream。並不是說stringstream有什麼固有的錯誤,但我不想另一個庫只是來完成這樣一個簡單的任務。將int轉換爲Glib :: ustring沒有stringstream

我的第一本能是用一個大的ol if語句編寫一個函數,或者爲每個數字使用一個字符數組,但必須有更清晰的東西。有其他選擇嗎?

+0

'油嘴:: ustring STR(STD :: to_string(123456));' – user657267

+0

好了,這也是一個令人印象深刻的解決方案,但它確實還需要一個STL庫,其中一些可能不希望。感到驚訝的是,之前沒有人在網上提到過。這是一個多年來圍繞網絡的話題,每個人都說使用stringstream>。< – CodeMouse92

+0

我對'ustring'不熟悉,但''format'函數不會這樣做嗎? 'ustring text = ustring :: format(123456);' – user657267

回答

2

Glib::ustring提供簡單的轉發不管你扔在一個format靜態函數(最多8個參數,沒有可變參數模板但似乎)到一個字符串流和返回格式的字符串:

Glib::ustring text = Glib::ustring::format(123456); 

由於C++ 11標準庫還具有用於將整數和浮點數一個重載to_string方法

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

再次,感謝。在封裝我自己的文件之前,我通過文檔挖掘了好幾個小時。滑潤是痛苦的,至少在我眼中是難以穿透的,而且沒有人似乎在網上提到過這一點。 Oy公司。 – CodeMouse92

+0

@ JasonMc92顯然至少從2008年開始就已經存在了,所以這之前沒有人提到它,這確實有點奇怪。 – user657267

+0

典型的文檔悖論:「它在(不可穿透的)文檔中,所以我們可以假設每個人都知道。」 >。> – CodeMouse92

0

編輯:此方法旨在完全避免STL,對於需要的情況下/庫。但是,Glib :: ustring確實使用STL,只是FYI。如果你使用其他一些自定義的字符串類,或者只是覺得自己像Glib一樣聰明,這可能仍然派上用場。

是的,它確實有可能,但它確實需要自定義功能。迄今爲止,這工作得很好,除了明顯的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; 
} 

(順便提一下,提出改善建議,歡迎!我希望讓這個更有效呢。)

+0

當我找到時間時,我會更新我的文章,但是USENET上的Christian Gollwitzer指出了更有效的解析數字的方法。人們只需要扭轉它們。 'if(i <0){print「 - 」; I = -i} I = 12345678 而I { 打印則i%10 I = I/10 }' – CodeMouse92