6
votes

Prenez le paramètre suivant comme largeur de champ dans string.format

en C #, j'ai une largeur que je veux utiliser pour certaines cordes, mais je ne saurai pas cette largeur avant l'exécution du temps d'exécution. Je fais quelque chose comme ceci: xxx

existe une directive de formatage de chaîne qui me permet de préciser cela sans casser ma propre chaîne de format comme ceci?

J'ai regardé autour de moi? sur le MSDN pendant un peu de temps et j'ai l'impression d'être manquant tout un chapitre sur les cordes de format ou quelque chose.


0 commentaires

8 Réponses :


3
votes

Vous pouvez faire quelque chose comme

string spaces = String.Concat(Enumerable.Repeat(" ", digits).ToArray());


1 commentaires

Hahah je sais, c'est assez drôle que j'ai manqué Padleft, je l'ai trouvé dès que j'ai écrit ça.



3
votes

0 commentaires

8
votes

Visez un coup d'oeil à padleft : xxx


1 commentaires

Je vais +1 vous, parce que je suis embarrassé, j'ai oublié Padleft, c'était sur la pointe de ma langue.



2
votes

Les fonctions mentionnées par d'autres œuvreront, mais cette page MSDN a une solution plus générale pour formater ces modifications au moment de l'exécution:

Formatage composite P>

Ils donnent des exemples beaucoup comme les vôtres. P>

strud> je pensais Vous essayiez de résoudre le cas général de composition d'une chaîne de format au moment de l'exécution. Par exemple, s'il n'y avait pas de Padleft intégré (), vous pouvez le faire: P>

    string s = string.Format(
            string.Format("Price = |{{0,{0}}}|", nColumnWidth),
            myInt);


1 commentaires

Peut-être que je suis aveugle mais je ne vois aucun exemple sur cette page qui fait quelque chose comme ce que je fais.



0
votes

Peut-être que cela aidera votre recherche sur le formatage:

Types de formatage
Formatage composite

Cependant, je ne pense pas que vous allez faire beaucoup mieux que cela, car le paramètre d'alignement doit faire partie de la chaîne de format et ne semble pas être représentée par une propriété.


1 commentaires

Si "le paramètre d'alignement doit faire partie de la chaîne de format", cela répond à ma question: ce n'est pas possible à String.Format. Je pensais qu'il y aurait un moyen d'utiliser des paramètres, tels que (format NIL "~ VD" Valeur des chiffres) dans LISP - Je sais que le format lisp est beaucoup plus puissant Général, mais j'ai pensé que l'utilisation d'un param était assez basique. Merci!



0
votes

Probablement surpeuîner, mais il suffit d'illustrer un moyen d'encapsuler le format Spécification et d'utiliser une surcharge de string.format code> qui accepte un iFormatProvider code>.

class Program
{
    public static void Main(string[] args)
    {
        int digits = 7;
        var format = new PaddedNumberFormatInfo(digits);
        Console.WriteLine(String.Format(format, "{0}", 123));
    }
}
class PaddedNumberFormatInfo : IFormatProvider, ICustomFormatter
{
    public PaddedNumberFormatInfo(int digits)
    {
        this.DigitsCount = digits;
    }

    public int DigitsCount { get; set; }

    // IFormatProvider Members
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
            return this;

        return null;
    }
    // ICustomFormatter Members
    public string Format(string format, object arg, IFormatProvider provider)
    {
        return String.Format(
            String.Concat("{0, ", this.DigitsCount, "}"), arg);
    }
}


0 commentaires

0
votes

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

Voir: AC # moyen de la largeur indirecte et de la mise en forme de style. p>

essentiellement c'est une méthode, formatex, qui agit comme String.Format, sauf Il permet d'alignement indirect et de spécificateurs de formatage. p>

FormatEx("{0,{1}:{2}}", value, width, formatString);


0 commentaires

0
votes

chaîne a un constructeur qui crée une chaîne avec un caractère donné répété n fois.

https://msdn.microsoft.com/en-us/library/xsa4321w (v = vs.110) .aspx xxx


0 commentaires