将C ++的Sprintf格式字符串转换为C#'S String.format
-
24-10-2019 - |
题
我找到了以下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#等效c ++格式字符串“%s_%0*s.bmp”是什么?
编辑,@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,则不会垫。
解决方案
用零使用填充字符串 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
, ,因为我认为这是原始代码中的一个错误。我认为,文件名上的填充的长度不太可能将循环的每次迭代中的一个增加一个。
其他提示
用于格式化细节,例如 0*
在 %0*s
, ,我这样做:
string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(k,'0'));
如果我做对了,那将需要 frames[k]
, ,并用0左将。
例如:
k=10;
frames[k] = "Hello";
frames[k].PadLeft(k,'0') ==> "00000Hello";
那是你追求的吗?
不隶属于 StackOverflow