在c ++中格式化索引

时间:2013-12-10 13:46:46

标签: c++ indexing format

我有一个for循环,我想将索引i(取值1-1000)格式化为0001-1000。我遇到了使用printf和cout格式化索引解决方案,但我想为字符串名称这样做。我正在尝试类似的东西,但它没有工作:

   for(int i=0; i<1000; i++){

      string num2string = setfill('0') +setw(4) + i; 
   } 

如何将setfill和setw转换为字符串对象?

3 个答案:

答案 0 :(得分:2)

setfillsetwIO 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::ostringstreamstd::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;