web-dev-qa-db-fra.com

Mettre en forme une chaîne en colonnes

Existe-t-il un moyen sympa de prendre quelque chose comme ça:

Nom du client - Ville, État - ID 
 Bob Whiley - Howesville, TN - 322 
 Marley Winchester - Old Towne, CA - 5653 

et formatez-le en quelque chose comme ceci:

Nom du client - Ville, État - ID 
 Bob Whiley - Howesville, TN - 322 
 Marley Winchester - Old Towne, CA - 5653 

Vous utilisez des commandes de format de chaîne?

Je ne suis pas trop accroché à ce qu'il faut faire si l'on est très long. Par exemple, ce serait bien pour moi:

Nom du client - Ville, État - ID 
 Bob Whiley - Howesville, TN - 322 
 Marley Winchester - Old Towne, CA - 5653 
 Super Personne de la ville - Nom de la ville longue, WA- 45648 

Pour fournir un certain contexte. J'ai une liste déroulante qui affiche des informations très similaires à cela. En ce moment, mon code pour créer l'élément dans la liste déroulante ressemble à ceci:

public partial class CustomerDataContract
{
    public string DropDownDisplay
    {
        get
        {
             return  Name + " - " + City + ",  " + State + " - " + ID;
        }
    }
}

Je cherche un moyen de mieux formater cela. Des idées?


Voici ce que j'ai fini avec:

HttpContext.Current.Server.HtmlDecode(
    String.Format("{0,-27} - {1,-15}, {2, 2} - {3,5}", 
    Name, City, State, ID)
    .Replace(" ", " "));

Le HtmlDecode change le en un espace qui peut supporter l'espace en supprimant le formatage de la liste déroulante.

36
Vaccano

Vous pouvez spécifier le nombre de colonnes occupées par le texte ainsi que l'alignement à l'aide de Console.WriteLine ou en utilisant String.Format:

// Prints "--123       --"
Console.WriteLine("--{0,-10}--", 123);
// Prints "--       123--"
Console.WriteLine("--{0,10}--", 123);

Le nombre spécifie le nombre de colonnes que vous souhaitez utiliser et le signe spécifie l'alignement (- pour l'alignement à gauche, + pour alignement à droite). Donc, si vous connaissez le nombre de colonnes disponibles, vous pouvez écrire par exemple quelque chose comme ceci:

public string DropDownDisplay { 
  get { 
    return String.Format("{0,-10} - {1,-10}, {2, 10} - {3,5}"),
      Name, City, State, ID);
  } 
} 

Si vous souhaitez calculer le nombre de colonnes sur la base de la liste entière (par exemple le nom le plus long), vous devrez obtenir ce nombre à l'avance et le transmettre en tant que paramètre à votre DropDownDisplay - là n'est pas possible de le faire automatiquement.

62
Tomas Petricek

En plus de la réponse de Tomas, je veux juste souligner que l'interpolation de chaînes peut être utilisée en C # 6 ou plus récent.

// with string format
var columnHeaders1 = string.Format($"|{0,-30}|{1,-4}|{2,-15}|{3,-30}|{4,-30}|{5,-30}|{6,-30}", "ColumnA", "ColumnB", "ColumnC", "ColumnD", "ColumnE", "ColumnF", "ColumnG");

// with string interpolation
var columnHeaders2 = $"|{"ColumnA",-30}|{"ColumnB",-4}|{"ColumnC",-15}|{"ColumnD",-30}|{"ColumnE",-30}|{"ColumnF",-30}|{"ColumnG",-30}";
1
willbush