185 votes

Comment vous mettre en forme le jour du mois pour dire « 11 », le « 21 » ou le « 23 » en Java ?

Je sais que cela va me donner le jour du mois sous forme de nombre ( , , `` ) :

Mais comment vous mettre en forme le jour du mois à dire , ou `` en Java ?

215voto

Greg Mattes Points 9578
<pre><code></code><p><code></code><code></code><code></code><a href="http://stackoverflow.com/posts/4011116/revisions">l’histoire de version sur la réponse</a> pour voir l’erreur).</p></pre>

60voto

kaliatech Points 8331

Il n’y a rien dans le JDK pour cela.

J’ai ne fonctionne pas cela par un compilateur, par conséquent peut-être des erreurs, mais vous voyez l’idée.

EDIT : J’ai vu certains accès rapide vers le bas de la voix dans un premier temps. Probablement à cause de l’inefficacité perçue. Même chose, mais moins susceptibles d’offenser :

45voto

Anand Shekhar Points 91
private String getCurrentDateInSpecificFormat(Calendar currentCalDate) {
    String dayNumberSuffix = getDayNumberSuffix(currentCalDate.get(Calendar.DAY_OF_MONTH));
    DateFormat dateFormat = new SimpleDateFormat(" d'" + dayNumberSuffix + "' MMMM yyyy");
    return dateFormat.format(currentCalDate.getTime());
}

private String getDayNumberSuffix(int day) {
    if (day >= 11 && day <= 13) {
        return "th";
    }
    switch (day % 10) {
    case 1:
        return "st";
    case 2:
        return "nd";
    case 3:
        return "rd";
    default:
        return "th";
    }
}

19voto

EmacsFodder Points 12284
String ordinal(int num)
{
  string[] suffix = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'];
  int m = num % 100;
  return String(num) + suffix[(m > 10 && m < 20) ? 0 : (m % 10)];
}

9voto

C.A.B. Points 1

Si vous essayez d'être conscient de l'i18n la solution obtenir encore plus compliqué.

Le problème est que dans d'autres langues, le suffixe peut dépendre non seulement sur le nombre lui-même, mais aussi sur le nom qu'il compte. Par exemple en russe, il serait "2-ой день", mais "2-ая неделя" (il s'agit de signifier "2ème journée", mais "2ème semaine"). Ce n'est pas valable si le formatage jours seulement, mais en un peu plus de cas générique, vous devez être conscient de la complexité.

Je pense que la solution sympa (je n'ai pas eu le temps de réellement mettre en œuvre) serait d'étendre SimpleDateFormetter à appliquer Local-conscient MessageFormat avant de passer à la classe parent. De cette façon, vous serait en mesure de soutenir disons que pour le mois de Mars formats %M pour obtenir "3-rd", %MM pour obtenir "03-rd" et %MMM pour obtenir des "tiers". De l'extérieur de la classe ressemble régulière SimpleDateFormatter, mais prend en charge plusieurs formats. Aussi si ce modèle serait par erreur appliqué par la régularité de la SimpleDateFormetter le résultat serait mal mis en forme, mais encore lisible.

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