6
votes

Comment puis-je formater une chaîne dans un champ de largeur fixe dans .NET?

J'essaie de formater une chaîne de longueur arbitraire dans un champ de largeur fixe pour l'affichage.

Utilisez une largeur de 20 à titre d'exemple et appelons la chaîne à format S. J'ajoute la chaîne formatée à un StringBuilder nommé b. P> xxx pré>

si la chaîne que je veux afficher est plus courte de 20 caractères, je peux le faire: P> xxx pré>

ou p> xxx pré>

jusqu'à présent, si bon. Mais si la chaîne dépasse 20 caractères, je souhaite que la chaîne soit tronquée de 20 caractères tel qu'il est ajouté. Le code ci-dessus ajoute la chaîne entière. P>

J'ai essayé ceci: p> xxx pré>

mais, cela déclenche une exception si la chaîne était plus courte de 20 caractères.

Donc, j'ai fini par: P>

Module Extensions
    <Extension()> _
    Function AppendFixed(ByVal b As StringBuilder, ByVal s As String, ByVal width As Integer) As StringBuilder
        If s.Length >= width Then
            b.Append(s, 0, width)
        Else
            b.Append(s)
            b.Append(" ", width - s.Length)
        End If
        Return b
    End Function
End Module


1 commentaires

Vous avez fini avec exactement le code que j'utilise pour le faire si nécessaire. Je pense que c'est à peu près le moyen le plus simple d'accomplir ce dont vous avez besoin.


4 Réponses :


3
votes

Je ne pense pas qu'il y ait un moyen plus élégant de le faire. Bien que vous puissiez envelopper cette fonctionnalité dans une méthode d'extension: xxx

et l'utiliser comme ceci: xxx


4 commentaires

N'hésitez pas à me laisser savoir si ma traduction vb.net devineuse n'a pas coupé la moutarde :)


Vous avez oublié un byval et utilisé une minuscule r en retour, mais il devrait toujours compiler et courir malgré les deux de ces deux. La grande faille est manquante _ après l'attribut, mais j'ai réparé que pour vous et que ce n'est requis que avant à .net 4.


Oh, et j'ai presque manqué la fonction Sub VS. Vous ne pouvez retourner que des valeurs des fonctions.


Merci pour l'entrée. Je vais mettre en œuvre une méthode d'extension.



6
votes

Je me demandais s'il y a une autre méthode qui aurait l'air plus élégante et éviter de rembourrer la chaîne

(accent ajouté) xxx

pour l'utiliser: xxx


2 commentaires

Je n'avais pas pensé à utiliser une méthode d'extension. Merci pour le conseil.


+1; Cela répond à la question avec une logique très explicite, donc +1. Mais PADRIGHT FAIRE implicitement cette vérification (ou l'équivalent logique) en interne?



2
votes

Je suggérerais de minimiser la contrainte sur le collecteur des ordures, il faut gérer séparément les cas où l'on doit renvoyer une chaîne de celles où l'on doit appender une chaîne à un StringBuilder. Il faut également séparer les cas où la chaîne à ajouter est plus courte que nécessaire, précisément la longueur souhaitée, ou plus longue que nécessaire.

Si l'on doit renvoyer une chaîne de la même longueur que l'original, renvoyez simplement la chaîne d'origine. Si la chaîne a besoin de rembourrage, coussinez-le avec un nouvelle chaîne ('', demandéeLength - theString.length) . Si cela doit être rendu plus court, retournez theString.Substring (0, DemandeDlength) .

Si on doit ajouter quelque chose à un StringBuilder et que la chaîne d'origine n'est plus que nécessaire, appendez la chaîne, puis utilisez la (char, int) surcharge de l'annexe pour ajouter du remplissage si nécessaire. Si la chaîne d'origine est trop longue, utilisez la (chaîne, int, int) surcharge de l'annexe pour ajouter uniquement la partie appropriée.


1 commentaires

Merci, SuperCat, pour le pointeur des (char, int) et (string, int, int) surcharges. Je les utiliserai dans ma méthode d'extension.



0
votes

Fonction MakeFixedlength (BIEVAL STR AS String, ByvalLengthLength version entier, Byval LR en tant que chaîne, Byval Chr Chr comme Char) Comme chaîne XXX


0 commentaires