格式化:如何把1转成“01”,2转成“02”,3转成“03”等等
Formatting: how to convert 1 to “01”, 2 to “02”, 3 to "03", and so on
以下代码以时间格式输出值,即如果它是 1:50pm 和 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。
想法?
如果您不介意开销,您可以使用 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();
}
从您的 开始:
"I assumed, using %02 was a standard c/c++ practice. Am I wrong?"
是的,你错了。 c/c++ 也不是问题,它们是不同的语言。
C++ std::cout
不支持 printf()
之类的格式化字符串。你需要的是 setw()
and 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
可用,类似于格式 string/place holder 语法。
作为其他答案中建议的 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:50pm 和 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。
想法?
如果您不介意开销,您可以使用 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();
}
从您的
"I assumed, using %02 was a standard c/c++ practice. Am I wrong?"
是的,你错了。 c/c++ 也不是问题,它们是不同的语言。
C++ std::cout
不支持 printf()
之类的格式化字符串。你需要的是 setw()
and 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
可用,类似于格式 string/place holder 语法。
作为其他答案中建议的 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 的作者。