我想將前導零的變量添加到字符串中。 我在Google上找不到任何東西,沒有人提及printf, ,但我想在沒有(s)printf的情況下執行此操作。將前導零添加到字符串中,但不包含(s)printf
有沒有讀者知道一種方式?
我想將前導零的變量添加到字符串中。 我在Google上找不到任何東西,沒有人提及printf, ,但我想在沒有(s)printf的情況下執行此操作。將前導零添加到字符串中,但不包含(s)printf
有沒有讀者知道一種方式?
// assuming that `original_string` is of type `std:string`:
std::string dest = std::string(number_of_zeros, '0').append(original_string);
這不會只考慮「original_string」長度而增加零嗎? 'number_of_zeros = 4 original_string =「99」 dest將變成:000099(而不是0099)'。如果我錯了,請糾正我,或者我可能不明白'前導零'是什麼意思...... – lepe 2015-07-06 04:05:44
@lepe它回答了書面的問題。 OP是否寫下他們真正意義的是另一回事。 – 2016-10-03 16:21:06
memcpy(target,'0',sizeof(target));
target[sizeof(target)-1] = 0;
然後把任何你想要的字符串零作爲前綴放在緩衝區的末尾。
如果是整數,記得log_base10(number)+1
(又名ln(number)/ln(10)+1
)會給出數字的長度。
不,謝謝你的嘗試,但我想能夠添加一個可變數量的零。 – 2011-05-26 19:19:28
@Guus:*表示可變數目的零。但是,如果能讓你快樂,你可以用其他數字代替(sizeof(target))。 – 2011-05-26 19:21:23
@Guus:具體來說,從您的評論下面,你想要%05d,對吧?如果緩衝區長度爲六個字符,那麼這正是我的代碼爲您所做的(至少是零填充部分,將數字放在最後留給您)。 – 2011-05-26 19:23:01
你可以使用std::string::insert
,std::stringstream
與stream 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;
}
應用:將整數填充到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
做它的C++的方法是用setw,ios_base::width和setfill
#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;
}
Nah,這跟sprintf差不多,但是感謝你的輸入(: – 2011-05-26 19:29:18
你可以做些什麼如:
std::cout << std::setw(5) << std::setfill('0') << 1;
這應打印00001
。
但是,請注意,填充字符是「粘性」的,所以當您使用零填充完成後,您將不得不使用std::cout << std::setfill(' ');
再次獲得正常行爲。
不錯,感謝你的輸入,但是用同樣的方法使用sprintf(: – 2011-05-26 19:33:55
看起來不粘.' std :: cout << std :: setw(5)<< std :: setfill('0')<< 1 << 1 << std :: endl;'產生:'000011' – 2016-04-14 13:37:27
@AleksanderFular'std :: setw'不粘。 std :: setfill'是粘性的,但是如果沒有過大的寬度就沒有什麼用處,所以你的第一個'1'得到'setw(5)',因此有前導零,但是之後的'setw ''被重新設置爲默認值,所以你的第二個'1'就打印爲'1',所以'00001' +'1' ='000011'。問題是如果你以後設置了'setw',發現以前的'setfill'字符仍然有效,因爲'setfill'不是sticky =>沒有被重置爲默認的空間。 – 2016-10-03 16:22:25
,如果你想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」;
這對我很好。您不需要將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();
}
一條線,但不限於整數和6個零的最大:
int number = 42;
int leading = 3; //6 at max
std::to_string(number*0.000001).substr(8-leading); //="042"
一個例子是好的。 – 2011-05-26 19:20:41
許多答案完全符合你的要求,但你說他們不是你想要的。很顯然,你的問題很少被問到(我沒有多少選擇,只能相應地投票)。 – 2011-05-26 19:39:57
@Jerry我很抱歉,我盡力了。我會在未來嘗試改進我的問題。 – 2011-05-26 19:41:36