2010-06-05 18 views
5

ho trovato il seguente codice C++ (commenti me aggiunto):Traducendo C++ string.Format 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()); 

Allora provo a tradurre in 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]); 

In sostanza, ciò che sarebbe l'equivalente C# della stringa di formato C++ "% s_% 0 * s.bmp"?

Modifica, @ Mark Byers:

ho provato il codice e ha fatto un piccolo programma di 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(); 
} 

Non è imbottitura per qualche motivo.

Modifica: Ho funzionato; non sarà pad se n = 2.

+0

Sei sicuro di voler riutilizzare 'k' per due scopi diversi? –

+0

Sei sicuro di queste stringhe di formato? Specificamente: '% 0 * s' - il modificatore' 0' in congiunzione con la conversione 's' è, secondo la pagina man qui, comportamento non definito. – Thanatos

+0

Questo è quello che mi è stato dato quando guardavo un programma open-source. – thebackup

risposta

3

Per pad una stringa di zeri utilizzare string.PadLeft:

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

In combinazione con string.Format:

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

Nota che ho cambiato k-n, come suppongo che questo è un bug in il codice originale Penso che sia improbabile che la lunghezza del padding sul nome del file aumentasse di uno in ogni iterazione del ciclo.

+0

Grazie, ma a quanto pare non è padding; vedi post originale. – thebackup

+0

@thebackup: non è padding perché hai impostato n = 2. n è la lunghezza minima. Se vuoi semplicemente aggiungere due zeri è sempre più semplice e non ha bisogno della funzione PadLeft. –

+0

Oh ok, ho capito ora; funziona come previsto - è proprio quello che volevo in primo luogo. Grazie mille, Mark. – thebackup

1

Per formattare i dettagli come il 0* in %0*s, mi piacerebbe fare in questo modo:

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

Se ho bene, ci vorrà frames[k], e di sinistra -applica con gli 0.

es .:

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

E 'questo quello che stai dopo?

+1

* in '% 0 * s' richiede che un parametro venga utilizzato per specificare la precisione. Quindi, 1 per '% s', 1 per' * ', e 1 per'% 0 * s', o 3. – Thanatos

+0

Grazie per l'aggiornamento, @Thantos. Modifica risposta. – abelenky

+0

Tranne che '0' con' s' sembra essere UB - guarda il mio commento sulla domanda. – Thanatos