4

I need a function to return a suffix for days when displaying text like the "th" in "Wednesday June 5th, 2008".

It only need work for the numbers 1 through 31 (no error checking required) and English.

paxdiablo
  • 854,327
  • 234
  • 1,573
  • 1,953

4 Answers4

9

Here is an alternative which should work for larger numbers too:

static const char *daySuffixLookup[] = { "th","st","nd","rd","th",
                           "th","th","th","th","th" };

const char *daySuffix(int n)
{
    if(n % 100 >= 11 && n % 100 <= 13)
        return "th";

    return daySuffixLookup[n % 10];
}
unwind
  • 391,730
  • 64
  • 469
  • 606
Adam Pierce
  • 33,531
  • 22
  • 69
  • 89
6

The following function works for C:

char *makeDaySuffix (unsigned int day) {
    //if ((day < 1) || (day > 31)) return "";
    switch (day) {
        case 1: case 21: case 31: return "st";
        case 2: case 22:          return "nd";
        case 3: case 23:          return "rd";
    }
    return "th";
}

As requested, it only works for the numbers 1 through 31 inclusive. If you want (possibly, but not necessarily) raw speed, you could try:

char *makeDaySuffix (unsigned int day) {
    static const char * const suffix[] = {
        "st","nd","rd","th","th","th","th","th","th","th",
        "th","th","th","th","th","th","th","th","th","th"
        "st","nd","rd","th","th","th","th","th","th","th"
        "st"
    };
    //if ((day < 1) || (day > 31)) return "";
    return suffix[day-1];
}

You'll note that I have bounds checking in there though commented out. If there's even the slightest possibility that an unexpected value will be passed in, you'll probably want to uncomment those lines.

Just keep in mind that, with the compilers of today, naive assumptions about what is faster in a high-level language may not be correct: measure, don't guess.

paxdiablo
  • 854,327
  • 234
  • 1,573
  • 1,953
2
const char *getDaySuffix(int day) {
    if (day%100 > 10 && day%100 < 14)
        return "th";
    switch (day%10) {
        case 1:  return "st";
        case 2:  return "nd";
        case 3:  return "rd";
        default: return "th";
    };
}

This one works for any number, not just 1-31.

Milan Babuškov
  • 59,775
  • 49
  • 126
  • 179
1

See my question here: How to convert Cardinal numbers into Ordinal ones (it's not the C# one).

Summary: looks like there's no way yet, with your limited requirements you can just use a simple function like the one posted.

Community
  • 1
  • 1
Roel
  • 19,338
  • 6
  • 61
  • 90