Translating 's chaîne de format sprintf à C # C ++ de la string.Format
-
24-10-2019 - |
Question
J'ai trouvé le code suivant C ++ (commentaires me ajoutés):
// 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());
J'essaie ensuite de traduire en 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]);
En fait, ce serait le C # équivalent de la chaîne de format C ++ "% S_% 0 * s.bmp"?
Modifier, Byers @ Mark:
J'ai essayé votre code et a fait un petit programme de test:
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();
}
Il est pas un rembourrage pour une raison quelconque.
Edit: Got it travail; ne sera pas pad si n = 2.
La solution
Pour cadrer une chaîne avec des zéros utiliser string.PadLeft
:
frames[k].PadLeft(n, '0')
En combinaison avec string.Format
:
int n = 15; // Get this from somewhere.
string frameName = string.Format("{0}_{1}.bmp",
prefix,
frames[k].PadLeft(n, '0'));
Notez que j'ai changé k
à n
, comme je suppose que ce bogue dans le code d'origine. Je pense qu'il est peu probable que la longueur du rembourrage sur le nom du fichier était destiné à augmenter d'un à chaque itération de la boucle.
Autres conseils
Pour le formatage des détails comme le 0*
dans %0*s
, je le ferais de cette façon:
string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(k,'0'));
Si je l'ai droit, il faudra frames[k]
, et gauche du pavé avec des 0.
par exemple:.
k=10;
frames[k] = "Hello";
frames[k].PadLeft(k,'0') ==> "00000Hello";
Est-ce que vous êtes après?