web-dev-qa-db-fra.com

Pad gauche ou droite avec string.format (pas padleft ou padright) avec une chaîne arbitraire

Puis-je utiliser String.Format () pour remplir une certaine chaîne avec des caractères arbitraires?

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

returns 

->             hello<-
->hello             <-

Je veux maintenant que les espaces soient un caractère arbitraire. La raison pour laquelle je ne peux pas le faire avec padLeft ou padRight est parce que je veux pouvoir construire la chaîne de formatage à un endroit/une heure différents, alors le formatage est réellement exécuté.

- MODIFIER -
Vu qu'il ne semble pas exister de solution à mon problème, j'ai trouvé ceci (après Suggestion de réflexion avant codage )
- EDIT2 -
J'avais besoin de scénarios plus complexes, alors j'ai choisi Réfléchissez à la deuxième suggestion de Coding

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

Parce que le code était un peu trop à mettre dans un post, je l'ai déplacé vers github en tant que Gist:
http://Gist.github.com/533905#file_padded_string_format_info

Là, les gens peuvent facilement le ramifier et tout ce qui :)

57
Boris Callens

Il y a une autre solution.

Implémentez IFormatProvider pour renvoyer un ICustomFormatter qui sera passé à la chaîne.

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

Ensuite, vous pouvez l'utiliser comme ceci:

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

Vous pouvez encapsuler la chaîne dans une structure qui implémente 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);
   }
}

Ensuite, utilisez ceci comme ça:

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

résultat:

"->xxxxxxxxxxxxxxxHello<-"
11
thinkbeforecoding

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"

2
Emax83

Edit: J'ai mal compris votre question, je pensais que vous demandiez comment remplir avec des espaces.

Ce que vous demandez n'est pas possible en utilisant le composant d'alignement string.Format; string.Format Remplit toujours des espaces. Consultez la section Composant d'alignement de MSDN: Formatage composite .

Selon Reflector, c'est le code qui s'exécute à l'intérieur de StringBuilder.AppendFormat(IFormatProvider, string, object[]) qui est appelé par string.Format:

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

Comme vous pouvez le voir, les blancs sont codés en dur pour être remplis d'espaces.

2
configurator