OVH Cloud OVH Cloud

Formatage de string

4 réponses
Avatar
Fabian Vilers
Bonjour à tous,

Je me demande si ceci est possible... Imaginons ce bout de code:

int NbItems = 3;
String message = String.Format("Nous avons {0} élément(s)", NbItems);

J'aimerais gérer facilement le plurier d'élément. Avec un formatage qui
réagit si c'est < 2 ou pas:

int NbItems = 3;
String message = String.Format("Nous avons {0} {1:élément;éléments}",
NbItems, NbItems);

Je reve ou ca vous dit quelquechose?

4 réponses

Avatar
Fabien Bezagu
Quelque chose dans ce gout devrait fonctionner :

String message = String.Format("Nous avons {0} élément{1}", NbItems,
(NbItems < 2 ? "" : "s"));

Je te déconseille cependant d'avoir recours à une fonction plus générique
car ce genre de manipulation ne permet pas facilement d'internationaliser
ton application.

Fabien

"Fabian Vilers" a écrit dans le message de
news: 42dd0647$0$1815$
Bonjour à tous,

Je me demande si ceci est possible... Imaginons ce bout de code:

int NbItems = 3;
String message = String.Format("Nous avons {0} élément(s)", NbItems);

J'aimerais gérer facilement le plurier d'élément. Avec un formatage qui
réagit si c'est < 2 ou pas:

int NbItems = 3;
String message = String.Format("Nous avons {0} {1:élément;éléments}",
NbItems, NbItems);

Je reve ou ca vous dit quelquechose?



Avatar
Fabian Vilers
> Je te déconseille cependant d'avoir recours à une fonction plus générique
car ce genre de manipulation ne permet pas facilement d'internationaliser
ton application.



Merci pour cette réponse et ce conseil. Mon application ne devrait jamais
être localisées, mais on ne sais jamais ;-)
Avatar
Ambassadeur Kosh
> Merci pour cette réponse et ce conseil. Mon application ne devrait jamais
être localisées, mais on ne sais jamais ;-)



outre le côté interchangeable, c'est pratique. un texte qui apparait à
l'écran et qui a besoin d'etre changé l'est immédiatement sans difficulté,
ni impact sur le code.

tu pourrais t'appuyer sur des resources.
c'est un truc qu'on trouve fréquement dans le framework : une classe
ResourceHelper qui fourni les chaines.
à defaut d'un ResourceHelper, des constantes feront l'affaire, mais c'est
quand meme un début d'organisation.
donc, pas de bricolage avec les "s" et "".

class Test
{
private const string MessageSingular = "Nous avons {0} élément" ;
private const string MessagePlural = "Nous avons {0} éléments" ;

public void f(int n)
{
string format = n < 2 ? MessageSingular : MessagePlural ;
string message = string.Format(format , n) ;
}
}

reste le probleme habituel avec Format, si la chaine comprend 3 parametre et
que tu n'en passes qu'un, c'est la fete, et ça ne se voit pas à la
compilation. alors qu'une fonction, ça se voit de suite. j'ai donc reecrit
un custom tool qui detecte les {0},{1},{2} et offre dans le ResourceHelper
generé des fonctions qui prennent les parametre. dans notre cas, on aurait
un truc qui ressemble à ceci

class ResourceHelper
{
public string MessageSingular(string arg0) ...
public string MessagePlural(string arg0) ...
}

si ça interesse qqun, je peux mettre les sources à disposition...
Avatar
Nicolas Guinet
Bonjour,

int NbItems = 2;
String message = String.Format("Nous avons {0} élément{1}", NbItems,
(1<NbItems?"s":"") );

Nicolas Guinet

"Fabian Vilers" a écrit dans le message de
news: 42dd0647$0$1815$
Bonjour à tous,

Je me demande si ceci est possible... Imaginons ce bout de code:

int NbItems = 3;
String message = String.Format("Nous avons {0} élément(s)", NbItems);

J'aimerais gérer facilement le plurier d'élément. Avec un formatage qui
réagit si c'est < 2 ou pas:

int NbItems = 3;
String message = String.Format("Nous avons {0} {1:élément;éléments}",
NbItems, NbItems);

Je reve ou ca vous dit quelquechose?