在使用std :: to_string()的C ++中,如何预填充从整数转换的字符串?我尝试使用#include和std :: setfill('0'),但是没有用。这是简单的测试代码。
#include <iostream>
#include <string>
//#include <iomanip> // setw, setfill below doesn't work
int main()
{
int i;
for (i=0;i<20;i++){
std::cout << "without zero fill : " << std::to_string(i) << ", with zero fill : " << std::to_string(i) << std::endl;
//std::cout << std::setw(3) << std::setfill('0') << "without zero fill : " << std::to_string(i) << ", with zero fill : " << std::to_string(i) << std::endl; // doesn't work
}
}
我想做的是,将一些数字转换为字符串,但其中一些数字填充为零,而其他数字则不是(我实际上是用它来创建文件名。)我应该怎么做? /> (我不知道为什么它不应该像使用%0d或%04d格式说明符的C语言那样简单。)
添加:从Add leading zero's to string, without (s)printf,我发现
int number = 42;
int leading = 3; //6 at max
std::to_string(number*0.000001).substr(8-leading); //="042"
这对我有用,但是我更喜欢自然方法,而不是像方法这样的技巧。
答案 0 :(得分:2)
ostringstream
似乎太过分了。您只需插入所需的零数字即可:
template<typename T/*, typename = std::enable_if_t<std::is_integral_v<T>>*/>
std::string to_string_with_zero_padding(const T& value, std::size_t total_length)
{
auto str = std::to_string(value);
if (str.length() < total_length)
str.insert(str.front() == '-' ? 1 : 0, total_length - str.length(), '0');
return str;
}
如果value
为负和/或T
为char
或相关类型,则此功能也可以正常工作。
答案 1 :(得分:1)
您可以使用std::to_string()
来代替std::ostringstream
。 IO机械手将使用std::ostringstream
。
#include <iostream>
#include <sstream>
#include <iomanip>
int main()
{
for ( int i = 1; i <= 10; ++i )
{
std::ostringstream str;
str << std::setw(3) << std::setfill('0') << i;
std::cout << str.str() << std::endl;
}
}
输出:
001
002
003
004
005
006
007
008
009
010
查看它在https://ideone.com/ay0Xzp上的运行情况。