Cette page vous donne une liste complète de toutes les règles de formatage numérique personnalisées:
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
Comme vous pouvez le voir, il n'y a rien là-dedans concernant les ordinaux, donc cela ne peut pas être fait en utilisant String.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, les ordinaux n'existent pas pour <= 0, j'ai donc mis à jour le code ci-dessus. Supprimé également les ToString()
méthodes redondantes .
Notez également que ce n'est pas internationalisé. Je n'ai aucune idée de ce à quoi ressemblent les ordinaux dans d'autres langues.
N'oubliez pas l'internationalisation!
Les solutions ici ne fonctionnent que pour l'anglais. Les choses deviennent beaucoup plus complexes si vous devez prendre en charge d'autres langues.
Par exemple, en espagnol, "1st" serait écrit comme "1.o", "1.a", "1.os" ou "1.as" selon que la chose que vous comptez est masculine, féminine ou plurielle. !
Donc, si votre logiciel doit prendre en charge différentes langues, essayez d'éviter les ordinaux.
la source
Ma version de la version de Jesse des versions de Stu et samjudson :)
Test unitaire inclus pour montrer que la réponse acceptée est incorrecte lorsque le nombre <1
la source
Simple, propre, rapide
Ou mieux encore, comme méthode d'extension
Maintenant, vous pouvez simplement appeler
ou même aussi direct que
la source
Vous devrez lancer le vôtre. Du haut de ma tête:
Vous pouvez alors faire
Modifié pour les exceptions du 11/12/13. J'ai dit du haut de ma tête :-)
Modifié pour 1011 - d'autres ont déjà corrigé cela, je veux juste m'assurer que les autres ne saisissent pas cette version incorrecte.
la source
J'ai plutôt aimé les éléments des solutions de Stu et de samjudson et les ai travaillés ensemble dans ce que je pense être un combo utilisable:
la source
Bien que je n'ai pas encore évalué cela, vous devriez pouvoir obtenir de meilleures performances en évitant toutes les déclarations de cas conditionnelles.
C'est java, mais un port vers C # est trivial:
Notez que la réduction des conditions et l'utilisation de la recherche de tableau devraient accélérer les performances si vous générez beaucoup d'ordinaux dans une boucle serrée. Cependant, je concède également que ce n'est pas aussi lisible que la solution de déclaration de cas.
la source
Semblable à la solution de Ryan, mais encore plus basique, j'utilise simplement un tableau simple et utilise le jour pour rechercher l'ordinal correct:
Je n'en ai pas eu besoin, mais je suppose que vous pouvez utiliser un tableau multidimensionnel si vous souhaitez avoir une prise en charge multilingue.
D'après ce dont je me souviens de mes jours Uni, cette méthode nécessite un minimum d'effort de la part du serveur.
la source
J'utilise cette classe d'extension:
la source
Version "moins redondante" de la réponse de samjudson demandée ...
la source
public static
et le renommer en un nom plus mnémonique (c'est-à-dire "OrdinalSuffix"). L'appelant peut vouloir la partie numérique dans différents formats (c'est-à-dire avec des virgules).Si vous cherchez un liner: p
la source
la source
EDIT : Comme YM_Industries le souligne dans le commentaire, la réponse de samjudson fonctionne pour les nombres supérieurs à 1000, le commentaire de nickf semble avoir disparu, et je ne me souviens pas quel était le problème que j'ai vu. Laissé cette réponse ici pour les temps de comparaison.
Beaucoup d'entre eux ne fonctionnent pas pour des nombres> 999, comme l' a souligné nickf dans un commentaire (EDIT: maintenant manquant).
Voici une version basée sur une version modifiée de la réponse acceptée samjudson qui le fait.
Aussi la réponse de Shahzad Qureshi en utilisant la manipulation de chaînes fonctionne très bien, mais il a une pénalité de performance. Pour générer beaucoup de ceux-ci, un exemple de programme LINQPad rend la version de chaîne 6-7 fois plus lente que celle entière (bien que vous deviez en générer beaucoup pour le remarquer).
Exemple LINQPad:
la source
Sur la base des autres réponses:
la source
FWIW, pour MS-SQL, cette expression fera le travail. Conservez le premier WHEN (
WHEN num % 100 IN (11, 12, 13) THEN 'th'
) en tant que premier de la liste, car cela dépend de la tentative avant les autres.Pour Excel:
L'expression
(MOD(A1-11,100)>2)
est VRAIE (1) pour tous les nombres sauf toute fin en11,12,13
(FAUX = 0). Se2 * RIGHT(A1) * (MOD(A1-11,100)>2) +1)
termine donc par 1 pour le 11/12/13, sinon:1 correspond à 3
2 à 5,
3 à 7
autres: 9
- et les 2 caractères requis sont sélectionnés parmi
"thstndrdth"
partir de cette position.Si vous voulez vraiment convertir cela assez directement en SQL, cela a fonctionné pour moi pour une poignée de valeurs de test:
la source
Il s'agit de l'implémentation dans
dart
et peut être modifié selon la langue.la source
Bien qu'il y ait beaucoup de bonnes réponses ici, je suppose qu'il y a de la place pour une autre, cette fois basée sur la correspondance des modèles, sinon pour autre chose, du moins pour une lisibilité discutable
et qu'est-ce qui rend cette solution spéciale? rien que le fait que j'ajoute des considérations de performances pour diverses autres solutions
franchement, je doute que les performances comptent vraiment pour ce scénario particulier (qui a vraiment besoin des ordinaux de millions de nombres) mais au moins cela fait ressortir quelques comparaisons à prendre en compte ...
la source
Un autre one-liner, mais sans comparaisons en indexant uniquement le résultat d'expression régulière dans un tableau.
La version PowerShell peut être encore raccourcie:
la source
Encore 1 doublure.
la source
Voici la classe d'extension DateTime. Copiez, collez et profitez
classe statique publique DateTimeExtensions {
Résultat :
9 octobre 2014
la source
Une autre alternative que j'ai utilisée sur la base de toutes les autres suggestions, mais ne nécessite aucun boîtier spécial:
la source