217 votes

.NET Formater une chaîne de caractères avec des espaces fixes

La méthode .NET String.Format permet-elle de placer une chaîne à une position fixe dans une chaîne de longueur fixe ?

"           String Goes Here"
"     String Goes Here      "
"String Goes Here           "

Comment cela se fait-il avec .NET ?

Modifier - J'ai essayé Format/PadLeft/PadRight à mort. Ils ne fonctionnent pas. Je ne sais pas pourquoi. J'ai fini par écrire ma propre fonction pour faire cela.

Modifier - J'ai fait une erreur et utilisé un deux-points au lieu d'une virgule dans le spécificateur de format. Cela devrait être "{0,20}".

Merci pour toutes les réponses excellentes et correctes.

50 votes

Je n'ai jamais eu de question sur le formatage des chaînes de caractères à laquelle je n'ai pas pu répondre en consultant cette page : blog.stevex.net/index.php/string-formatting-in-csharp

0 votes

@jcollum : J'adorerais voter votre réponse mais je ne peux pas le faire pour les commentaires.

0 votes

PadLeft fonctionne pour moi ; vérifiez que vous laissez l'espace dans PadLeft(20, 'HERE GOES A SPACE')

504voto

Guffa Points 308133

Vous obtiendrez ainsi exactement les cordes que vous avez demandées :

string s = "String goes here";
string lineAlignedRight  = String.Format("{0,27}", s);
string lineAlignedCenter = String.Format("{0,-27}",
    String.Format("{0," + ((27 + s.Length) / 2).ToString() +  "}", s));
string lineAlignedLeft   = String.Format("{0,-27}", s);

67 votes

Ceci devrait être marqué comme la réponse correcte à la question, mais il semble que l'OP a quitté stackoverflow.

10 votes

Si vous cherchez les coches vertes par rapport aux votes positifs les plus élevés, vous ne savez pas comment faire le SO ;)

2 votes

@DaveJellison Il semble que quelqu'un doive écrire un plugin pour corriger cela, ou SO devrait simplement en faire une préférence utilisateur configurable.

69voto

Konrad Rudolph Points 231505

La première et la dernière, au moins, sont possibles en utilisant la syntaxe suivante :

String.Format("{0,20}", "String goes here");
String.Format("{0,-20}", "String goes here");

17voto

Joel Coehoorn Points 190579

On vous a montré PadLeft et PadRight . Cela permettra de combler les lacunes PadCenter .

public static class StringUtils
{
    public static string PadCenter(this string s, int width, char c)
    {
        if (s == null || width <= s.Length) return s;

        int padding = width - s.Length;
        return s.PadLeft(s.Length + padding / 2, c).PadRight(width, c);
    }
}

Note à moi-même : n'oubliez pas de mettre à jour votre propre CV : "Un jour, j'ai même corrigé le code de Joel Coehoorn !" ;-D -Serge

0 votes

Joel, bon extrait - j'essaie de l'utiliser et il n'est pas tout à fait centré, tel qu'il est. On dirait que la ligne de retour devrait être quelque chose comme (je n'ai pas assez de rep pour éditer...) : return s.PadLeft((padding / 2) + s.Length, c).PadRight(width, c) ;

11voto

Jedi Master Spooky Points 2374

Essayez ceci :

"String goes here".PadLeft(20,' ');
"String goes here".PadRight(20,' ');

pour le centre, obtenez la longueur de la chaîne et faites padleft et padright avec les caractères nécessaires.

int len = "String goes here".Length;
int whites = len /2;
"String goes here".PadRight(len + whites,' ').PadLeft(len + whites,' ');

0 votes

Il semble que les appels à String.Format() soient superflus.

0 votes

Les méthodes Pad sont bonnes car les options de format exigent que les longueurs soient des constantes (c'est-à-dire, String.Format("{0,-length}", something) ne compilera pas.

6voto

chi Points 31

Merci pour la discussion, cette méthode fonctionne également (VB) :

Public Function StringCentering(ByVal s As String, ByVal desiredLength As Integer) As String
    If s.Length >= desiredLength Then Return s
    Dim firstpad As Integer = (s.Length + desiredLength) / 2
    Return s.PadLeft(firstpad).PadRight(desiredLength)
End Function
  1. Centrage de chaîne() prend deux valeurs en entrée et retourne une chaîne de caractères formatée. formatée.
  2. Lorsque la longueur de s est supérieure ou égale à deisredLength la fonction renvoie la chaîne originale.
  3. Lorsque la longueur de s est plus petit que longueur souhaitée il sera rembourré aux deux extrémités.
  4. Comme l'espacement des caractères est entier et qu'il n'y a pas de demi-espace, nous pouvons avoir une répartition inégale de l'espace. Dans cette implémentation, la plus grande division va à l'extrémité avant.
  5. La fonction nécessite .NET Framework en raison de PadLeft() et PadRight() .
  6. Dans la dernière ligne de la fonction, la liaison se fait de gauche à droite, donc firstpad est appliqué, suivi par le longueur souhaitée pad.

Voici la version C# :

public string StringCentering(string s, int desiredLength)
{
    if (s.Length >= desiredLength) return s;
    int firstpad = (s.Length + desiredLength) / 2;
    return s.PadLeft(firstpad).PadRight(desiredLength);
}

Pour faciliter la compréhension, la variable entière firstpad est utilisé. s.PadLeft(firstpad) applique le nombre (correct) d'espaces blancs de tête. L'espace le plus à droite PadRight(longueur souhaitée) a une reliure plus faible se termine par l'application d'espaces blancs de fin de ligne.

1 votes

Bienvenue chez SO, chi. C'est encore un autre exemple d'un excellent premier message et d'une excellente réponse. +1

0 votes

Merci Brian, la question originale en haut de ce post est un excellent point de départ. Je m'inspire de tous les messages et réponses qui précèdent le mien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X