2010-02-22 17 views
5

En C#, tengo un ancho que quiero usar para algunas cadenas, pero no conoceré ese ancho hasta el tiempo de ejecución. Estoy haciendo algo como esto:Tome el siguiente parámetro como ancho de campo en String.Format

string.Format("{0, " + digits + "}", value) // prints 123 as " 123" 

¿Hay un formato de cadenas de directiva que me deja sin especificar esta rompiendo mi propia cadena de formato en conjunto como este?

Miré en MSDN por un momento y siento que me falta un capítulo entero sobre cadenas de formato o algo así.

Respuesta

7

Tome un vistazo a PadLeft:

s = "123".PadLeft(5); // Defaults to spaces 
s = "123".PadLeft(5, '.'); // Pads with dots 
+0

te haré +1, porque estoy avergonzado de haber olvidado padleft, estaba en la punta de mi tounge. –

2

se puede hacer algo como

string test = valueString.PadLeft(10,' '); 

o incluso más tonto

string spaces = String.Concat(Enumerable.Repeat(" ", digits).ToArray()); 
+1

masoquista .... PadLeft. –

+0

jaja, lo sé, es bastante gracioso que extrañara padleft, lo encontré tan pronto como escribí eso. –

1

Las funciones mencionadas por otros trabajarán, pero esta página de MSDN tiene una solución más general al formato que cambia en tiempo de ejecución:

Composite Formatting

Se dan ejemplos tanto como la suya.

Edit: Pensé que estabas tratando de resolver el caso general de componer una cadena de formato en tiempo de ejecución. Por ejemplo, si no hay fueron construidos en PadLeft(), usted puede hacer esto:

int myInt = 123; 
    int nColumnWidth = 10; 

    string fmt = string.Format("Price = |{{0,{0}}}|", nColumnWidth); 

    // now fmt = "Price = |{0,5}|" 

    string s = string.Format(fmt, myInt); 

incluso se puede hacer todo eso en una sola línea, pero es feo:

string s = string.Format(
      string.Format("Price = |{{0,{0}}}|", nColumnWidth), 
      myInt); 
+0

Tal vez estoy ciego pero no veo ningún ejemplo en esa página que haga algo como lo que estoy haciendo. – Ken

0

Tal vez esto ayudará con su investigación sobre el formato:

Formatting Types
Composite Formatting

Howe Ver, no creo que vayas a hacer mucho mejor que esto, ya que el parámetro de alineación debe ser parte de la cadena de formato y no parece estar representado por una propiedad.

+1

Si "el parámetro de alineación debe ser parte de la cadena de formato", eso responde a mi pregunta: no es posible desde cadena. Formato. Pensé que habría alguna forma de usar params, como '(format nil" ~ vD "digits value)' en Lisp - Sé que el 'formato' de Lisp es mucho más poderoso en general, pero pensé que usar un param era básico suficiente. ¡Gracias! – Ken

0

Probablemente exagerado pero solo para ilustrar una forma de encapsular la especificación de formato y usar una sobrecarga de String.Format que acepte IFormatProvider.

class Program 
{ 
    public static void Main(string[] args) 
    { 
     int digits = 7; 
     var format = new PaddedNumberFormatInfo(digits); 
     Console.WriteLine(String.Format(format, "{0}", 123)); 
    } 
} 
class PaddedNumberFormatInfo : IFormatProvider, ICustomFormatter 
{ 
    public PaddedNumberFormatInfo(int digits) 
    { 
     this.DigitsCount = digits; 
    } 

    public int DigitsCount { get; set; } 

    // IFormatProvider Members 
    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 

     return null; 
    } 
    // ICustomFormatter Members 
    public string Format(string format, object arg, IFormatProvider provider) 
    { 
     return String.Format(
      String.Concat("{0, ", this.DigitsCount, "}"), arg); 
    } 
} 
0

He publicado un artículo de CodeProject que puede ser lo que buscas.

Ver: A C# way for indirect width and style formatting.

Básicamente se trata de un método, Formatex, que actúa como String.Format, excepto que permite la alineación indirecta y especificadores FormatString.

FormatEx("{0,{1}:{2}}", value, width, formatString); 

Medios formato al valor de varargs 0, en un ancho de campo especificado por varargs 1, usando un código formattingString especificado por varargs 2.

Editar: Internamente, se hace lo que muchos otros han sugerido en su respuestas Acabo de completar el análisis sintáctico y la determinación de los valores finales para usar para la alineación y el formato. También agregué un modificador de "alineación de centro".

-Jesse

Cuestiones relacionadas