C++ 格式化:如何将1转换为“;01”;,2至“;02&x201D;,3至「;03",;,等等

C++ 格式化:如何将1转换为“;01”;,2至“;02&x201D;,3至「;03",;,等等,c++,string,datetime,int,itoa,C++,String,Datetime,Int,Itoa,以下代码以时间格式输出值,即,如果是1:50pm和8秒,则输出为01:50:08 cout << "time remaining: %02d::%02d::%02" << hr << mins << secs; 现在,如果我输出“currenthour”、“currentmins”和“currentsecs”,它将输出与1:50:8相同的示例时间,而不是01:50:08 想法?如果您不介意开销,您可以使用std::stringstream #in

以下代码以时间格式输出值,即,如果是1:50pm和8秒,则输出为01:50:08

cout << "time remaining: %02d::%02d::%02" << hr << mins << secs;
现在,如果我输出“currenthour”、“currentmins”和“currentsecs”,它将输出与1:50:8相同的示例时间,而不是01:50:08


想法?

如果您不介意开销,您可以使用
std::stringstream

#include <sstream>
#include <iomanip>

std::string to_format(const int number) {
    std::stringstream ss;
    ss << std::setw(2) << std::setfill('0') << number;
    return ss.str();
}
#包括
#包括
std::字符串到_格式(常量整数){
std::stringstream-ss;
ss从您的:


“我认为,使用%02是一种标准的c/c++实践。我错了吗?”

是的,你错了。而且c/c++不是什么东西,它们是不同的语言

C++
std::cout
不支持类似于格式化字符串的
printf()
。您需要的是和:



此外,还有一个类似于格式字符串/占位符语法的boost库可用。

作为其他答案中建议的IOStreams的替代方案,您还可以使用安全的printf实现,例如:

它支持printf和类似Python的格式字符串语法,其中可以省略类型说明符:

fmt::printf("time remaining: {:02}::{:02}::{:02}", hr, mins, secs);

免责声明:我是fmt的作者。

您的第一个cout语句有效吗?这里没有:如果您先将值转换为time\u t会更容易吗?我假设,使用%02是一种标准的c/c++实践。我错了吗?我使用的是CryEngine,该语句在那里有效,但CryEngine具有不同的功能,而不是cout。对于reFerese,这在CryEngine中起作用:CryLog(“剩余时间:%02d::%02d::%02”,hr,min,sec);我喜欢好的老的
std::printf
…啊。不,这是不一样的。这就像
printf
cout
是完全不同的野兽。我会把你的开场白改为:“使用一个std::stringstream”“。只有当软件正常工作但不满足其时间限制时,性能才应该是一个问题。@RichN请随意编辑我的帖子。虽然OP向我建议使用/需要一个相当低级别的实现,这就是我添加性能提示的原因。然而,我完全同意你的论点。
cout << "time remaining: " << setfill('0')
     << setw(2) <<  hr << ':' << setw(2) << mins << ':' << setw(2) << secs;
std::ostringstream oss;
oss << setfill('0')
     << setw(2) <<  hr << ':' << setw(2) << mins << ':' << setw(2) << secs;
cout << "time remaining: " << oss.str();
fmt::printf("time remaining: %02d::%02d::%02d", hr, mins, secs);
fmt::printf("time remaining: {:02}::{:02}::{:02}", hr, mins, secs);