web-dev-qa-db-fra.com

C # - Insérer un nombre variable d'espaces dans une chaîne? (Formater un fichier de sortie)

Très bien, je prends des données dans une liste avec laquelle je remplis un DataGridView et que je les exporte dans un fichier texte. J'ai déjà effectué la fonction pour l'exporter au format CSV et j'aimerais également créer une version en texte brut.

Parce que les titres et les autres éléments ont une longueur variable, lorsque le fichier est enregistré puis ouvert dans le Bloc-notes, cela ressemble à un désordre, car rien ne s'aligne.

J'aimerais que la sortie ressemble à ceci:

Sample Title One   Element One   Whatever Else
Sample Title 2     Element 2     Whatever Else
S. T. 3            E3            Whatever Else

Je pense pouvoir faire une boucle sur chacun des éléments pour obtenir la longueur du plus long et pouvoir calculer le nombre d'espaces à ajouter à chacun des éléments restants.

Ma question principale est la suivante: Existe-t-il un moyen élégant d’ajouter un nombre variable de caractères dans une chaîne? Ce serait bien d’avoir quelque chose comme: myString.insert(index, charToInsert, howManyToInsert);

Bien sûr, je peux évidemment écrire une fonction pour le faire via une boucle, mais je voulais voir s'il y avait une meilleure façon de le faire.

Merci d'avance!

-Sootah

52
Sootah

Pour cela, vous voulez probablement myString.PadRight(totalLength, charToInsert).

Voir String.PadRight, méthode (Int32) pour plus d'informations.

101
Gabe

Utilisez String.Format() ou TextWriter.Format() (selon la manière dont vous écrivez dans le fichier) et spécifiez la largeur d'un champ.

String.Format("{0,20}{1,15}{2,15}", "Sample Title One", "Element One", "Whatever Else");

Vous pouvez également spécifier la largeur d'un champ dans les chaînes interpolées:

$"{"Sample Title One",20}{"Element One",15}{"Whatever Else",15}"

Et juste pour que vous le sachiez, vous pouvez créer une chaîne de caractères répétés en utilisant le constructeur de chaînes approprié.

new String(' ', 20); // string of 20 spaces
41
Jeff Mercado

Utilisation String.Format:

string title1 = "Sample Title One";
string element1 = "Element One";
string format = "{0,-20} {1,-10}";

string result = string.Format(format, title1, element1);
//or you can print to Console directly with
//Console.WriteLine(format, title1, element1);

Au format {0,-20} signifie que le premier argument a une longueur fixe de 20 et que le signe négatif garantit que la chaîne est imprimée de gauche à droite.

3
Cheng Chen

Juste pour le plaisir, voici les fonctions que j'ai écrites pour le faire avant d'avoir le bit .PadRight:

    public string insertSpacesAtEnd(string input, int longest)
    {
        string output = input;
        string spaces = "";
        int inputLength = input.Length;
        int numToInsert = longest - inputLength;

        for (int i = 0; i < numToInsert; i++)
        {
            spaces += " ";
        }

        output += spaces;

        return output;
    }

    public int findLongest(List<Results> theList)
    {
        int longest = 0;

        for (int i = 0; i < theList.Count; i++)
        {
            if (longest < theList[i].title.Length)
                longest = theList[i].title.Length;
        }
        return longest;
    }

    ////Usage////
    for (int i = 0; i < storageList.Count; i++)
    {
        output += insertSpacesAtEnd(storageList[i].title, longest + 5) +   storageList[i].rank.Trim() + "     " + storageList[i].term.Trim() + "         " + storageList[i].name + "\r\n";
    }
2
Sootah

Je suis d'accord avec Justin, et le WhiteSpace CHAR peut être référencé avec codes ASCII ici Le nombre de caractères 32 représente un espace blanc. Par conséquent :

string.Empty.PadRight(totalLength, (char)32);

Une approche alternative: Créez tous les espaces manuellement dans une méthode personnalisée et appelez-la:

private static string GetSpaces(int totalLength)
    {
        string result = string.Empty;
        for (int i = 0; i < totalLength; i++)
        {
            result += " ";
        }
        return result;
    }

Et appelez-le dans votre code pour créer des espaces blancs: GetSpaces (14);

0
Davood Rokni