Frage

Ich fand den folgenden C ++ - Code (Kommentare selbst hinzugefügt):

// 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());

Ich versuche dann, es in C# zu übersetzen

// 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]);

Was wäre im Grunde genommen das C# Äquivalent der C ++ -Format -Zeichenfolge "%s_%0*s.bmp"?

Bearbeiten, @mark byers:

Ich habe Ihren Code ausprobiert und ein kleines Testprogramm erstellt:

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();
 }

Aus irgendeinem Grund ist es nicht gepolstert.

EDIT: Halten Sie es zum Laufen; Pad wird nicht, wenn n = 2.

War es hilfreich?

Lösung

Um eine Schnur mit Nullen zu padeln string.PadLeft:

frames[k].PadLeft(n, '0')

In Kombination mit string.Format:

int n = 15; // Get this from somewhere.
string frameName = string.Format("{0}_{1}.bmp",
                                 prefix,
                                 frames[k].PadLeft(n, '0'));

Beachten Sie, dass ich mich verändert habe k zu n, wie ich annehme, dass dies ein Fehler im ursprünglichen Code ist. Ich denke, es ist unwahrscheinlich, dass die Länge der Polsterung auf dem Dateinamen um eins in jeder Iteration der Schleife zunehmen sollte.

Andere Tipps

Für Formatierungsdetails wie die 0* in %0*s, Ich würde es so machen:

string.Format("{0}_{1}.bmp", prefix, frames[k].PadLeft(k,'0'));

Wenn ich es richtig habe, wird es dauern frames[k], und links mit 0 mit 0.

z.B:

k=10;
frames[k] = "Hello";
frames[k].PadLeft(k,'0') ==> "00000Hello";

Nach dem wählst du das?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top