如何检查字符串的长度并返回前导零

时间:2015-10-19 16:41:28

标签: c++ string visual-c++ string-formatting

问题是如何检查我的字符串filenum的长度,这个字符串会改变,例如它可能是'1'我怎么能在'1'上添加4个前导零,使得filenum ='00001'等等让我们说filenum ='21'并添加三个前导零的filenum ='00021'我总是希望文件num的长度为5.此外,在我得到新值之后,我如何将该值用于我的路径。任何帮助将不胜感激!

这是我到目前为止所得到的但是我得到了这个错误(错误C2665:'basic_string< char,struct std :: char_traits,class std :: allocator> :: basic_string

void CJunkView::OnCadkeyButton() 

{ 

   CString dbdir15 = "Dir15";
   CString dbdir14 = "Dir14";
   std::string filenum = m_csFileName;
  //CString fileName3 = "15001.prt";
   CString dbyear = m_csDatabaseYear;

   if(filenum.length() < 1)
   {
      std::string filenums = std::string(5 - filenum.length(), "0") + filenum;
   }
   else if(filenum.length() < 2)
  {
      std::string filenums = std::string(4 - filenum.length(), "0") + filenum;

  }
  else if(filenum.length() < 3)
  {
     std::string filenums = std::string(3 - filenum.length(), "0") + filenum;
  }
  else if(filenum.length() < 4)
  {
     std::string filenums = std::string(2 - filenum.length(), "0") + filenum;
  }
  else if(filenum.length() < 5)
  {
      std::string filenums = std::string(1 - filenum.length(), "0") + filenum;
  }


    if(m_csDatabaseYear == "15")
    {
      CString fileToOpen = "\"\\\\CARBDATA\\VOL1\\Docs\\PREFORM\\15T\\" + dbdir15 +"\\" + filenum + "\"";
      CString exePath = "\"C:\\CK19\\Ckwin.exe\"";
      CString cmd = "start " + exePath + ", " + fileToOpen;
      system (cmd.GetBuffer(cmd.GetLength() + 1));
      //PrintMessage("File Found 2015");
    }

     //file not found tell user file not found.

    else if(m_csDatabaseYear == "14")
    {
      CString fileToOpen = "\"\\\\CARBDATA\\VOL1\\Docs\\PREFORM\\14T\\" + dbdir14 +"\\" + filenum + "\"";
      CString exePath = "\"C:\\CK19\\Ckwin.exe\"";
      CString cmd = "start " + exePath + ", " + fileToOpen;
      system (cmd.GetBuffer(cmd.GetLength() + 1));
      //PrintMessage("File Found 2015");
    }
    else
    {

      PrintMessage("File Not Found");
    }

}

3 个答案:

答案 0 :(得分:3)

如果您想使用CString类(因为您的帖子似乎标有"visual-c++",并且您似乎已在代码中使用CString - 可能在Win32层边界处),您可以使用CString::Format() method

特别是,你可以传递一个%05d字符串格式说明符,这意味着你想要一个5位数的填充:

int n = 1; // or whatever...
CString paddedNum;
paddedNum.Format(L"%05d", n);

// paddedNum contains "00001"

然后,您可以使用CString的operator+来构建完整路径/文件名,以连接多个子字符串。

或者您仍然可以使用CString::Format()为完整路径/文件名指定更复杂的字符串格式。

您可以将printf() format specification syntax用于CString::Format()

答案 1 :(得分:2)

可以轻松完成,例如std::ostringstream和正常stream manipulators

std::ostringstream os;
os << std::setfill('0') << std::setw(5) << filenum;
std::cout << os.str() << '\n';  // Get the string in the stream and output it

如果filenum是例如"1"然后上面三行的输出应该是

00001

答案 2 :(得分:1)

您正在尝试调用不存在的std::string构造函数。您要调用的构造函数需要一个char作为输入,但您要传递char*字符串文字。此外,您的if陈述无论如何都是错误的,并且过度杀伤。您只需要1 if来处理所有情况。你甚至没有使用你正在创建的filenums变量,你应该将填充添加到filenum本身。

试试这个:

std::string filenum = m_csFileName;
if (filenum.length() < 5)
    filenum = std::string(5 - filenum.length(), '0') + filenum;