2009-02-12 12 views
55

¿Puedo usar String.Format() para rellenar una determinada cadena con caracteres arbitrarios?Almohadilla izquierda o derecha con string.format (no padleft o padright) con cadena arbitraria

Console.WriteLine("->{0,18}<-", "hello"); 
Console.WriteLine("->{0,-18}<-", "hello"); 

returns 

->    hello<- 
->hello    <- 

Ahora quiero que los espacios sean un carácter arbitrario. La razón por la que no puedo hacerlo con padLeft o padRight es porque quiero ser capaz de construir la cadena de formato en un lugar/tiempo diferente, entonces el formateo se ejecuta realmente.

--EDIT--
visto que no parece ser una solución existente a mi problema me ocurrió esto (después de Think Before Coding's suggestion)
--EDIT2--
que necesitaba algunos de los escenarios más complejos, así que fui a Think Before Coding's second suggestion

[TestMethod] 
public void PaddedStringShouldPadLeft() { 
    string result = string.Format(new PaddedStringFormatInfo(), "->{0:20:x} {1}<-", "Hello", "World"); 
    string expected = "->xxxxxxxxxxxxxxxHello World<-"; 
    Assert.AreEqual(result, expected); 
} 
[TestMethod] 
public void PaddedStringShouldPadRight() 
{ 
    string result = string.Format(new PaddedStringFormatInfo(), "->{0} {1:-20:x}<-", "Hello", "World"); 
    string expected = "->Hello Worldxxxxxxxxxxxxxxx<-"; 
    Assert.AreEqual(result, expected); 
} 
[TestMethod] 
public void ShouldPadLeftThenRight() 
{ 
    string result = string.Format(new PaddedStringFormatInfo(), "->{0:10:L} {1:-10:R}<-", "Hello", "World"); 
    string expected = "->LLLLLHello WorldRRRRR<-"; 
    Assert.AreEqual(result, expected); 
} 
[TestMethod] 
public void ShouldFormatRegular() 
{ 
    string result = string.Format(new PaddedStringFormatInfo(), "->{0} {1:-10}<-", "Hello", "World"); 
    string expected = string.Format("->{0} {1,-10}<-", "Hello", "World"); 
    Assert.AreEqual(expected, result); 
} 

Debido a que el código fue un poco demasiado para poner en un post, la trasladó a gitHub como una esencia: http://gist.github.com/533905#file_padded_string_format_info

la gente no puede expandirse fácilmente y cualquiera que sea :)

+0

I cree que debe asegurarse de que la cadena no esté vacía. Pasaría la prueba: cadena.Fomat ("{0}", (PaddedString) "Hola"); ? – configurator

Respuesta

30

Hay otra solución.

Implementar IFormatProvider para devolver un ICustomFormatter que será pasado a string.Format:

public class StringPadder : ICustomFormatter 
{ 
    public string Format(string format, object arg, 
     IFormatProvider formatProvider) 
    { 
    // do padding for string arguments 
    // use default for others 
    } 
} 

public class StringPadderFormatProvider : IFormatProvider 
{ 
    public object GetFormat(Type formatType) 
    { 
    if (formatType == typeof(ICustomFormatter)) 
     return new StringPadder(); 

    return null; 
    } 
    public static readonly IFormatProvider Default = 
    new StringPadderFormatProvider(); 
} 

A continuación, se puede utilizar de esta manera:

string.Format(StringPadderFormatProvider.Default, "->{0:x20}<-", "Hello"); 
+0

Éste permite formatear múltiples argumentos. OP actualizada El parámetro –

+0

para GetFormat debe ser (Type formatType) en lugar de (Type type) Creo. – demokritos

2

Editar: no he entendido bien su pregunta, pensé que estabas preguntando cómo rellenar con espacios.

Lo que está preguntando no es posible utilizando el componente de alineación string.Format; string.Format siempre almohadillas con espacios en blanco. Consulte la sección Alignment Component de MSDN: Composite Formatting.

De acuerdo con reflector, este es el código que se ejecuta dentro de StringBuilder.AppendFormat(IFormatProvider, string, object[]) que es llamada por string.Format:

int repeatCount = num6 - str2.Length; 
if (!flag && (repeatCount > 0)) 
{ 
    this.Append(' ', repeatCount); 
} 
this.Append(str2); 
if (flag && (repeatCount > 0)) 
{ 
    this.Append(' ', repeatCount); 
} 

Como se puede ver, espacios en blanco están codificados para ser llenado con espacios en blanco.

+0

He entendido mal la pregunta ... – configurator

+0

Es posible con números ... Creo que es realmente estúpido si es posible con números y no con cadenas. –

+0

¿Cómo es posible con números? – configurator

11

Usted puede encapsular la cadena en una estructura que implementa IFormattable

public struct PaddedString : IFormattable 
{ 
    private string value; 
    public PaddedString(string value) { this.value = value; } 

    public string ToString(string format, IFormatProvider formatProvider) 
    { 
     //... use the format to pad value 
    } 

    public static explicit operator PaddedString(string value) 
    { 
    return new PaddedString(value); 
    } 
} 

A continuación, utilice esto como que:

string.Format("->{0:x20}<-", (PaddedString)"Hello"); 

resultado:

"->xxxxxxxxxxxxxxxHello<-" 
3

simple:

 


    dim input as string = "SPQR" 
    dim format as string ="" 
    dim result as string = "" 

    'pad left: 
    format = "{0,-8}" 
    result = String.Format(format,input) 
    'result = "SPQR " 

    'pad right 
    format = "{0,8}" 
    result = String.Format(format,input) 
    'result = " SPQR" 

 
Cuestiones relacionadas