如何检查字符串的长度和 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;
问题是我如何检查我的字符串 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;