格式化:如何将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... 啊。不,那不一样。就像printfprintfcout 是完全不同的野兽。 【参考方案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”等的主要内容,如果未能解决你的问题,请参考以下文章

excel金额如何转为大写?

如何将pdf转为markdown

为啥将视频转为GIF后,文件反而比视频大的多了?

excel怎么转为pdf

js日期转换成字符串

为啥PDF转为Word以后打开没有文字