214 votes

Y a-t-il un moyen facile de créer des ordinaux en c# ?

Y a-t-il une façon simple en c# pour créer des ordinaux pour un certain nombre ? Par exemple :

  • 1 retourne 1er
  • 2 retourne 2ème
  • 3 retourne 3e
  • .. .etc

Est-ce possible via `` ou y a-t-il toutes les fonctions disponibles pour ce faire ?

328voto

samjudson Points 27483

Cette page vous donne une liste complète de toutes les commandes numériques règles de mise en forme:

http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

Comme vous pouvez le voir, il n'y a rien sur les ordinaux, de sorte qu'il ne peut pas être fait avec de la Ficelle.Format. Cependant ce n'est pas vraiment difficile d'écrire une fonction pour le faire.

public static string AddOrdinal(int num)
{
    if( num <= 0 ) return num.ToString();

    switch(num % 100)
    {
        case 11:
        case 12:
        case 13:
            return num + "th";
    }

    switch(num % 10)
    {
        case 1:
            return num + "st";
        case 2:
            return num + "nd";
        case 3:
            return num + "rd";
        default:
            return num + "th";
    }

}

Mise à jour: Techniquement Ordinaux n'existent pas pour <= 0, alors j'ai mis à jour le code ci-dessus. Également supprimé les redondant ToString() des méthodes.

A noter aussi, ce n'est pas internationalisé. Je n'ai aucune idée de ce que les ordinaux ressembler dans d'autres langues.

76voto

roomaroo Points 2539

N’oubliez pas l’internationalisation !

Les solutions ici travaillent uniquement pour l’anglais. Les choses deviennent beaucoup plus complexes si vous avez besoin soutenir d’autres langues.

Par exemple, en espagnol « 1er » s’écrirait comme « 1.o », « 1 », « 1.os » ou « 1.as » selon si la chose vous comptez est masculin, féminin ou pluriel !

Donc, si votre logiciel doit prendre en charge différentes langues, essayez d’éviter les ordinaux.

23voto

Si. Points 10543

Ma version de la version de Jesse des versions de Stu et de samjudson  :)

Test unitaire inclus pour montrer que la réponse acceptée est incorrect lorsque nombre

13voto

Jesse C. Slicer Points 11750

J’ai plutôt aimé des éléments de solutions de Stutant de samjudsonet travaillé ensemble dans ce que je pense est un combo utilisable :

9voto

Ryan McGeary Points 76053

Alors que je n’ai pas comparé cela encore, vous devriez être en mesure d’obtenir les meilleures performances en évitant toutes les instructions case conditionnelles.

Il s’agit de java, mais un port pour c# est trivial :

Remarque, la réduction des instructions conditionnelles et l’utilisation de la recherche tableau devraient accélérer les performances si générant beaucoup de nombres ordinaux dans une boucle serrée. Toutefois, je reconnais aussi que ce n’est pas aussi lisible que la solution de l’instruction case.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X