Как мне предоставить суффикс для дней месяца? - PullRequest
4 голосов
/ 03 октября 2008

Мне нужна функция для возврата суффикса в течение нескольких дней при отображении текста, например "th" в "Wednesday June 5th, 2008".

Требуется работать только для цифр от 1 до 31 (проверка ошибок не требуется) и английского языка.

Ответы [ 4 ]

9 голосов
/ 03 октября 2008

Вот альтернатива, которая должна работать и для больших чисел:

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];
}
5 голосов
/ 03 октября 2008

Следующая функция работает для 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";
}

По запросу, он работает только для номеров от 1 до 31 включительно. Если вы хотите (возможно, но не обязательно) сырую скорость, вы можете попробовать:

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];
}

Вы заметите, что я проверяю границы там, хотя и закомментирован. Если есть даже малейшая вероятность того, что неожиданное значение будет передано, возможно, вы захотите раскомментировать эти строки.

Просто имейте в виду, что с сегодняшними компиляторами наивные предположения о том, что быстрее в языке высокого уровня, могут быть неверными: измерять, не угадывать.

2 голосов
/ 03 октября 2008
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";
    };
}

Этот работает для любого числа, не только 1-31.

1 голос
/ 03 октября 2008

См. Мой вопрос здесь: Как преобразовать кардинальные числа в порядковые (это не C #).

Резюме: похоже, что пока нет пути, с вашими ограниченными требованиями вы можете просто использовать простую функцию, такую ​​как опубликованная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...