我有一个for循环,我想将索引i(取值1-1000)格式化为0001-1000。我遇到了使用printf和cout格式化索引解决方案,但我想为字符串名称这样做。我正在尝试类似的东西,但它没有工作:
for(int i=0; i<1000; i++){
string num2string = setfill('0') +setw(4) + i;
}
如何将setfill和setw转换为字符串对象?
答案 0 :(得分:2)
setfill
和setw
是IO manipulators,必须使用<<
运算符应用于IO流。在您的情况下,您需要创建stringstream
以将流操作重定向到字符串。例如,这会打印0013
:
#include <iostream>
#include <sstream>
#include <iomanip>
std::string num2string(int n)
{
std::stringstream ss;
ss << std::setfill('0') << std::setw(4) << n;
return ss.str();
}
int main()
{
std::cout << num2string(13);
}
答案 1 :(得分:1)
如果你想获得一个字符串作为结果并且仍然使用setfill和setw,你可以使用字符串流:
for(int i=0; i<1000; i++){
std::ostringstream stringStream;
stringStream << std::setfill ('0') << std::setw (4) << i;
std::string num2string = stringStream.str();
}
答案 2 :(得分:1)
请改用std::ostringstream
。 std::string
本身没有很多格式化助手。它是ostream
(如cout
是其中的一个实例):
std::ostringstream ss; // Note: not creating it everytime to repeat less work
ss << setfill('0');
for(int i=0; i<1000; i++) {
ss.str("");
ss << setw(4) << i;
string num2string = ss.str();
}
不幸的是,对于您的情况,setw
不会保留在stringstream
状态,因此您必须每次都设置它。
第三方替代方案是boost format library:
#include <boost/format.hpp>
....
string num2string = boost::format("%04d")%i;