我找到了以下C ++代码(评论自己添加):
// frame_name is a char array
// prefix is std::string
// k is a for loop counter
// frames is a std::vector string
sprintf(frameName, "%s_%0*s.bmp", prefix.c_str(), k, frames[k].c_str());
然后我尝试将其翻译为C#
// prefix is string
// k is a for loop counter
// frames is List<string>
string frameName = string.Format("{0}_(what goes in here?).bmp", prefix, k, frames[k]);
基本上,C ++格式字符串“%s_%0 * s.bmp”的C#等价物是什么?
编辑,@ Mark Byers:
我已经尝试过您的代码并制作了一个小测试程序:
static void Main(string[] args)
{
List<string> frames = new List<string>();
frames.Add("blah");
frames.Add("cool");
frames.Add("fsdt");
string prefix = "prefix";
int n = 2;
int k = 0;
string frameName = string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(n, '0'));
Console.WriteLine(frameName); // outputs prefix_blah.bmp, should output prefix_00blah.bmp
Console.ReadLine();
}
由于某种原因,它不是填充。
编辑:搞定了;如果n = 2,则不会填充。
答案 0 :(得分:3)
使用string.PadLeft
填充带零的字符串:
frames[k].PadLeft(n, '0')
与string.Format
结合使用:
int n = 15; // Get this from somewhere.
string frameName = string.Format("{0}_{1}.bmp",
prefix,
frames[k].PadLeft(n, '0'));
请注意,我已将k
更改为n
,因为我认为这是原始代码中的错误。我认为文件名中填充的长度不太可能在循环的每次迭代中增加一个。
答案 1 :(得分:1)
要格式化0*
中的%0*s
等详细信息,我会这样做:
string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(k,'0'));
如果我说得对,它将需要frames[k]
,并用0表示左键。
e.g:
k=10;
frames[k] = "Hello";
frames[k].PadLeft(k,'0') ==> "00000Hello";
这就是你要追求的吗?