Я нашел следующий код 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'));
Если бы он у меня был справа он займет кадров [k]
, а слева заполните его нулями.
например:
k=10;
frames[k] = "Hello";
frames[k].PadLeft(k,'0') ==> "00000Hello";
Это то, что вам нужно?