Перевод строки формата C ++ sprintf в строку C #. Формат - PullRequest
5 голосов
/ 06 июня 2010

Я нашел следующий код 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.

Ответы [ 2 ]

3 голосов
/ 06 июня 2010

Для заполнения строки нулями используйте 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 голос
/ 06 июня 2010

Для форматирования деталей, таких как 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";

Это то, что вы ищете?

...