2

以下代码以时间格式输出值,即如果它是下午 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。

想法?

4

3 回答 3

7

如果您不介意开销,您可以使用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();
}
于 2016-02-24T16:59:48.773 回答
3

根据您的评论

“我认为,使用 %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;

如果你想要 astd::string作为结果,你可以std::ostringstream以同样的方式使用 a:

std::ostringstream oss;
oss << setfill('0')
     << setw(2) <<  hr << ':' << setw(2) << mins << ':' << setw(2) << secs;
cout << "time remaining: " << oss.str();

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

于 2016-02-24T17:01:20.343 回答
0

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

fmt::printf("time remaining: %02d::%02d::%02d", hr, mins, secs);

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

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

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

于 2016-02-29T20:41:01.790 回答