格式化:如何将1转为“01”、2转为“02”、3转为“03”等
Posted
技术标签:
【中文标题】格式化:如何将1转为“01”、2转为“02”、3转为“03”等【英文标题】:Formatting: how to convert 1 to “01”, 2 to “02”, 3 to "03", and so on 【发布时间】:2016-02-24 16:54:59 【问题描述】:以下代码以时间格式输出值,即如果是下午 1:50 和 8 秒,则将其输出为 01:50:08
cout << "time remaining: %02d::%02d::%02" << hr << mins << secs;
但我想做的是 (a) 将这些整数转换为 char/string (b),然后将相同的时间格式添加到其对应的 char/string 值中。
我已经达到(a),我只想达到(b)。
例如
char currenthour[10] = 0 , currentmins[10] = 0 , currentsecs[10] = 0 ;
itoa(hr, currenthour, 10);
itoa(mins, currentmins, 10);
itoa(secs, currentsecs, 10);
现在,如果我输出“currenthour”、“currentmins”和“currentsecs”,它将输出与 1:50:8 相同的示例时间,而不是 01:50:08。
想法?
【问题讨论】:
您的第一个 cout 语句有效吗?它不在这里:coliru.stacked-crooked.com/a/47f11bcdd5421c21 先将值转换成time_t会不会更容易? 我认为,使用 %02 是标准的 c/c++ 实践。我错了吗?我正在使用 CryEngine 并且该语句在那里有效,但是 CryEngine 具有不同的功能,而不是 cout。作为参考,这在 CryEngine 中有效:CryLog("剩余时间:%02d::%02d::%02", hr, min, sec); 我爱好老std::printf
...
啊。不,那不一样。就像printf
。 printf
和 cout
是完全不同的野兽。
【参考方案1】:
如果您不介意开销,可以使用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::stringstream'”。只有当软件正常工作但不满足其时序限制时,性能才应该成为问题。跨度> @RichN 随意编辑我的帖子。尽管对我来说,OP 建议使用/想要一个相当低级的实现,这就是我添加性能提示的原因。不过我完全同意你的论点。【参考方案2】:来自您的comment:
“我认为,使用 %02 是标准的 c/c++ 实践。我错了吗?”
是的,你错了。也不是 c/c++,它们是不同的语言。
C++ std::cout
不支持 printf()
之类的格式化字符串。你需要的是setw()
和setfill()
:
cout << "time remaining: " << setfill('0')
<< setw(2) << hr << ':' << setw(2) << mins << ':' << setw(2) << secs;
如果您想要std::string
作为结果,您可以以相同的方式使用std::ostringstream
:
std::ostringstream oss;
oss << setfill('0')
<< setw(2) << hr << ':' << setw(2) << mins << ':' << setw(2) << secs;
cout << "time remaining: " << oss.str();
还有一个 boost 库 boost::format
可用,类似于格式字符串/占位符语法。
【讨论】:
【参考方案3】:作为其他答案中建议的 iostreams 的替代方案,您还可以使用安全的 printf 实现,例如 fmt library:
fmt::printf("time remaining: %02d::%02d::%02d", hr, mins, secs);
它支持 printf 和类似 Python 的格式字符串语法,其中类型说明符可以省略:
fmt::printf("time remaining: :02:::02:::02", hr, mins, secs);
免责声明:我是 fmt 的作者。
【讨论】:
以上是关于格式化:如何将1转为“01”、2转为“02”、3转为“03”等的主要内容,如果未能解决你的问题,请参考以下文章