2010-06-05 21 views
5

encontré el ++ siguiente código C (comentarios añadidos a mí mismo):Traducción 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()); 

entonces trato de traducirlo a 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]); 

Básicamente, lo sería el equivalente de C# de la cadena de formato C++ "% s_% 0 * s.bmp"?

Editar, Byers @ Marcos:

he intentado su código e hizo un pequeño programa de prueba:

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

No es acolchado por alguna razón.

Editar: Lo tengo trabajando; no cojín si n = 2.

+0

¿Estás seguro de que deseas reutilizar 'k' para dos propósitos diferentes? –

+0

¿Estás seguro de esas cadenas de formato? Específicamente: '% 0 * s' - el modificador' 0' en conjunción con la conversión 's' es, de acuerdo con la página del manual aquí, un comportamiento indefinido. – Thanatos

+0

Eso es lo que me dieron cuando miraba un programa de código abierto. – thebackup

Respuesta

3

Para rellenar una cadena de ceros utilizar string.PadLeft:

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

En combinación con string.Format:

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

Tenga en cuenta que he cambiado k-n, como supongo que esto es un error en el código original. Creo que es poco probable que la longitud del relleno en el nombre del archivo se haya incrementado en uno en cada iteración del ciclo.

+0

Gracias, pero aparentemente no es relleno; ver publicación original. – thebackup

+0

@thebackup: No es relleno porque ha establecido n = 2. n es la longitud mínima. Si solo desea agregar dos ceros siempre es mucho más fácil y no necesita la función PadLeft. –

+0

Oh bien, lo entiendo ahora; funciona como se esperaba, es justo lo que quería en primer lugar. Muchas gracias, Mark. – thebackup

1

Para dar formato a los detalles como el 0* en %0*s, me gustaría hacerlo de esta manera:

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

Si lo tengo, tomará frames[k], ya la izquierda -pad con 0's.

ej .:

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

es eso lo que está buscando?

+1

El * en '% 0 * s' solicita que se use un parámetro para especificar la precisión. Por lo tanto, 1 para '% s', 1 para' * 'y 1 para'% 0 * s', o 3. – Thanatos

+0

Gracias por la actualización, @Thantos. Editando respuesta – abelenky

+0

Excepto '0' con' s' parecería ser UB - ver mi comentario sobre la pregunta. – Thanatos