.NET Formater une chaîne avec des espaces fixes

199

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 en utilisant .NET?

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

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

Merci pour toutes les réponses excellentes et correctes.

user72491
la source
48
Je n'ai jamais eu de question de formatage de chaîne à laquelle je n'ai pas pu répondre en allant sur cette page: blog.stevex.net/index.php/string-formatting-in-csharp
jcollum
@jcollum: J'adorerais voter pour votre réponse, mais personne ne peut le faire pour les commentaires
Dinah
PadLeft fonctionne pour moi, vérifiez que vous quittez l'espace dans PadLeft (20, 'HERE GOES A SPACE')
Jedi Master Spooky
Qu'entend-on par «laisser l'espace dedans»? Si vous voulez dire - suis-je en train de "couper" la chaîne, alors non. Ça ne marche toujours pas.
user72491

Réponses:

473

Cela vous donnera exactement les chaînes 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);
Guffa
la source
64
Cela devrait être marqué comme la bonne réponse à la question, mais il semble que l'OP ait quitté stackoverflow.
Oliver
9
Si vous recherchez le chèque vert par rapport aux votes positifs les plus élevés, vous ne savez pas comment le faire;)
Dave Jellison
2
@DaveJellison On dirait que quelqu'un a besoin d'écrire un plugin pour résoudre ce problème, ou SO devrait simplement en faire une préférence utilisateur configurable.
Walter Stabosz
1
@WalterStabosz ne pouvait pas être plus d'accord.
Dave Jellison
2
pourquoi est-ce fait avec ,au lieu de :comme dans tous les autres cas de formatage?
LuckyLikey
65

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");
Konrad Rudolph
la source
49

À partir de Visual Studio 2015, vous pouvez également le faire avec des chaînes interpolées (c'est une astuce de compilation, donc peu importe la version du framework .net que vous ciblez).

string value = "String goes here";
string txt1 = $"{value,20}";
string txt2 = $"{value,-20}";
Sprotty
la source
9
sa fonction ac # 6.
LuckyLikey
J'utilise C # 6 depuis des années et je ne le connaissais pas! Voté :)
Avrohom Yisroel
17

On vous a montré PadLeftet PadRight. Cela comblera les manquants 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

Joel Coehoorn
la source
Joel, bon extrait - J'essaie de l'utiliser et il ne se centre pas tout à fait comme ça. On dirait que la ligne de retour devrait être quelque chose comme (je n'ai pas assez de répétition pour éditer ...): return s.PadLeft ((padding / 2) + s.Length, c) .PadRight (width, c);
shaunmartin
11

essaye ça:

"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,' ');
Jedi Master Spooky
la source
On dirait que les appels String.Format () sont superflus.
Joel Coehoorn
Les méthodes de pad sont bonnes car les options de format exigent que les longueurs soient constantes (c'est-à-dire qu'elles String.Format("{0,-length}", something)ne seront pas compilées.
Roberto
6

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. StringCentering () prend deux valeurs d'entrée et renvoie une chaîne formatée.
  2. Lorsque la longueur de s est supérieure ou égale à deisredLength , la fonction renvoie la chaîne d'origine.
  3. Lorsque la longueur de s est inférieure à longueur souhaitée , elle sera rembourrée aux deux extrémités.
  4. En raison de l'espacement des caractères est entier et 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é principale.
  5. La fonction nécessite .NET Framework en raison de PadLeft () et PadRight () .
  6. Dans la dernière ligne de la fonction, la liaison est de gauche à droite, donc le premier pavé est appliqué suivi du pavé de longueur souhaité .

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, le premier pavé de variable entière est utilisé. s.PadLeft (firstpad) applique le (nombre correct de) premiers espaces blancs. Le PadRight le plus à droite (la longueur souhaitée) a une liaison inférieure se termine en appliquant des espaces blancs à la fin.

chi
la source
1
Bienvenue à SO, chi. Ceci est encore un autre exemple d'un GRAND premier message et réponse. +1
Brian
Merci Brian, la question originale en haut de cet article est un excellent point de départ. Je suis inspiré par tous les messages et réponses qui ont précédé le mien.
chi
1

Voici une version VB.NET que j'ai créée, inspirée de la réponse de Joel Coehoorn, de l'édition d'Oliver et du commentaire de shaunmartin:

    <Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer, ByVal c As Char) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2), c).PadRight(width, c)

End Function

<Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2)).PadRight(width)

End Function

Ceci est configuré comme une extension de chaîne, à l'intérieur d'un module public (la façon dont vous faites les extensions dans VB.NET, un peu différent de C #). Mon léger changement est qu'il traite une chaîne nulle comme une chaîne vide et qu'il remplit une chaîne vide avec la valeur de largeur (répond à mes besoins particuliers). Espérons que cela se convertira facilement en C # pour tous ceux qui en ont besoin. S'il y a une meilleure façon de référencer les réponses, les modifications et les commentaires que j'ai mentionnés ci-dessus, qui ont inspiré mon message, faites-le moi savoir et je le ferai - Je suis relativement nouveau dans la publication et je ne pouvais pas comprendre laisser un commentaire (peut-être pas encore assez de représentants).

Jeff
la source
0

J'ai posté un article CodeProject qui peut être ce que vous voulez.

Voir: AC # way pour la mise en forme indirecte de la largeur et du style.

Fondamentalement, c'est une méthode, FormatEx, qui agit comme String.Format, sauf qu'elle permet un modificateur d'alignement centré.

FormatEx("{0,c10}", value);

Signifie centrer la valeur de varArgs [0] dans un champ de 10 caractères, pencher à droite si un espace de remplissage supplémentaire est requis.

FormatEx("{0,c-10}", value);

Signifie centrer la valeur de varArgs [0] dans un champ large de 10 caractères, pencher à gauche si un espace de remplissage supplémentaire est requis.

Edit: en interne, c'est une combinaison du PadCenter de Joel avec une analyse pour restructurer le format et varArgs pour un appel à String.Format qui fait ce que vous voulez.

-Jesse

Jesse Chisholm
la source
-1

il semble que vous vouliez quelque chose comme ça, qui vous placera à un point fixe dans une chaîne de longueur constante:

Dim totallength As Integer = 100
Dim leftbuffer as Integer = 5
Dim mystring As String = "string goes here"
Dim Formatted_String as String = mystring.PadLeft(leftbuffer + mystring.Length, "-") + String.Empty.PadRight(totallength - (mystring.Length + leftbuffer), "-")

notez que cela aura des problèmes si mystring.length + leftbuffer dépasse la longueur totale

Atilio Jobson
la source
-7
/// <summary>
/// Returns a string With count chars Left or Right value
/// </summary>
/// <param name="val"></param>
/// <param name="count"></param>
/// <param name="space"></param>
/// <param name="right"></param>
/// <returns></returns>
 public static string Formating(object val, int count, char space = ' ', bool right = false)
{
    var value = val.ToString();
    for (int i = 0; i < count - value.Length; i++) value = right ? value + space : space + value;
    return value;
}
Paulos02
la source
3
N'utilisez pas ce code - il génère beaucoup d'allocations de chaînes inutiles. Utilisez plutôt les spécificateurs de format intégrés et les méthodes de remplissage.
Oskar Berggren
1
sacré .. imaginez utiliser cela dans une boucle :)
LuckyLikey