




Для 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];
}
Вы заметите, что у меня есть ограничения там, где я закомментировал. Если есть даже возможность малейший, что будет передано неожиданное значение, вы, вероятно, захотите раскомментировать эти строки.
Просто имейте в виду, что с современными компиляторами наивные предположения о том, что быстрее на языке высокого уровня, могут быть неверными: измерять, не угадывать.
Вот альтернатива, которая должна работать и для больших чисел:
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];
}
P.S. Я знаю, что это не входило в исходный вопрос, но это интересное упражнение.
Ха-ха, международная версия была бы совершенно другой, вероятно, поисковые таблицы были бы лучшим способом ее реализовать.
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.
Первая проверка также может быть if ((day % 100) / 10 == 1) return "th";.
См. Мой вопрос здесь: Как преобразовать кардинальные числа в порядковые (это не C#).
Резюме: похоже, что пока нет возможности, с вашими ограниченными требованиями вы можете просто использовать простую функцию, подобную опубликованной.
Это отличное решение - хотите использовать интернационализированную версию?