如何检查字符串的长度和 return 带前导零的值

How to check length of string and return a value with leading zero's

问题是我如何检查我的字符串 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");
    }

}

可以很容易地完成,例如std::ostringstream and the normal 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

如果你想使用 CString class(因为你的 post 似乎标有 "visual-c++" 并且你似乎已经在你的 CString代码 - 可能在 Win32 层边界),您可以使用 CString::Format() method.

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

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

// paddedNum contains "00001"

然后,您可以构建完整的 path/filename,只需使用 CString 的 operator+,连接几个子字符串。

或者您仍然可以使用 CString::Format(),为完整的 path/filename.

指定更复杂的字符串格式

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

您正在尝试调用不存在的 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;