2011-05-26 63 views
11

我想將前導零的變量添加到字符串中。 我在Google上找不到任何東西,沒有人提及printf, ,但我想在沒有(s)printf的情況下執行此操作。將前導零添加到字符串中,但不包含(s)printf

有沒有讀者知道一種方式?

+0

一個例子是好的。 – 2011-05-26 19:20:41

+2

許多答案完全符合你的要求,但你說他們不是你想要的。很顯然,你的問題很少被問到(我沒有多少選擇,只能相應地投票)。 – 2011-05-26 19:39:57

+0

@Jerry我很抱歉,我盡力了。我會在未來嘗試改進我的問題。 – 2011-05-26 19:41:36

回答

9
// assuming that `original_string` is of type `std:string`: 

std::string dest = std::string(number_of_zeros, '0').append(original_string); 
+8

這不會只考慮「original_string」長度而增加零嗎? 'number_of_zeros = 4 original_string =「99」 dest將變成:000099(而不是0099)'。如果我錯了,請糾正我,或者我可能不明白'前導零'是什麼意思...... – lepe 2015-07-06 04:05:44

+0

@lepe它回答了書面的問題。 OP是否寫下他們真正意義的是另一回事。 – 2016-10-03 16:21:06

1
memcpy(target,'0',sizeof(target)); 
target[sizeof(target)-1] = 0; 

然後把任何你想要的字符串零作爲前綴放在緩衝區的末尾。

如果是整數,記得log_base10(number)+1(又名ln(number)/ln(10)+1)會給出數字的長度。

+0

不,謝謝你的嘗試,但我想能夠添加一個可變數量的零。 – 2011-05-26 19:19:28

+0

@Guus:*表示可變數目的零。但是,如果能讓你快樂,你可以用其他數字代替(sizeof(target))。 – 2011-05-26 19:21:23

+0

@Guus:具體來說,從您的評論下面,你想要%05d,對吧?如果緩衝區長度爲六個字符,那麼這正是我的代碼爲您所做的(至少是零填充部分,將數字放在最後留給您)。 – 2011-05-26 19:23:01

35

你可以使用std::string::insertstd::stringstreamstream manipulators,或Boost.Format

#include <string> 
#include <iostream> 
#include <iomanip> 
#include <boost/format.hpp> 
#include <sstream> 

int main() { 
    std::string s("12"); 
    s.insert(0, 3, '0'); 
    std::cout << s << "\n"; 

    std::ostringstream ss; 
    ss << std::setw(5) << std::setfill('0') << 12 << "\n"; 
    std::string s2(ss.str()); 
    std::cout << s2; 

    boost::format fmt("%05d\n"); 
    fmt % 12; 
    std::string s3 = fmt.str(); 
    std::cout << s3; 
} 
+0

應用:將整數填充到20個字符:'auto padded = std :: to_string(num); padded.insert(0,20U - std :: min(std :: string :: size_type(20),padded.length()),'0');''min'不讓你纏繞,正在嘗試墊太長。 (對於64位以下的任何整數,20個字符不會有這個問題)。因爲min會抱怨某些平臺上的不匹配,所以需要將其轉換爲'size_type'。 – Eponymous 2017-08-29 21:38:53

3

做它的C++的方法是用setwios_base::widthsetfill

#include <iostream> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
    const int a = 12; 
    const int b = 6; 

    cout << setw(width) << row * col; 
    cout << endl; 

    return 0; 
} 
+0

Nah,這跟sprintf差不多,但是感謝你的輸入(: – 2011-05-26 19:29:18

10

你可以做些什麼如:

std::cout << std::setw(5) << std::setfill('0') << 1; 

這應打印00001

但是,請注意,填充字符是「粘性」的,所以當您使用零填充完成後,您將不得不使用std::cout << std::setfill(' ');再次獲得正常行爲。

+0

不錯,感謝你的輸入,但是用同樣的方法使用sprintf(: – 2011-05-26 19:33:55

+1

看起來不粘.' std :: cout << std :: setw(5)<< std :: setfill('0')<< 1 << 1 << std :: endl;'產生:'000011' – 2016-04-14 13:37:27

+0

@AleksanderFular'std :: setw'不粘。 std :: setfill'是粘性的,但是如果沒有過大的寬度就沒有什麼用處,所以你的第一個'1'得到'setw(5)',因此有前導零,但是之後的'setw ''被重新設置爲默認值,所以你的第二個'1'就打印爲'1',所以'00001' +'1' ='000011'。問題是如果你以後設置了'setw',發現以前的'setfill'字符仍然有效,因爲'setfill'不是sticky =>沒有被重置爲默認的空間。 – 2016-10-03 16:22:25

32

,如果你想n_zero零的字段我可以給這一個行的解決方案:

std::string new_string = std::string(n_zero - old_string.length(), '0') + old_string; 

例如: old_string = 「45」; n_zero = 4; new_string =「0045」;

+3

我喜歡這個。這意味着我不必構造一個stringstream,它對內部部件有相當的包袱。 – Robinson 2016-01-29 12:14:01

+0

完美,正是我所期待的。 (並且評論+1以上) – Kyslik 2016-04-07 20:26:30

1

這對我很好。您不需要將setfill切換回「」,因爲這是一個臨時流。

std::string to_zero_lead(const int value, const unsigned precision) 
{ 
    std::ostringstream oss; 
    oss << std::setw(precision) << std::setfill('0') << value; 
    return oss.str(); 
} 
0

一條線,但不限於整數和6個零的最大:

int number = 42; 
int leading = 3; //6 at max 
std::to_string(number*0.000001).substr(8-leading); //="042" 

Run it