Шлифуя очередную программу и вкладывая в нее души, хочется выводить не:
"1 карточек", "2 карточек" и "5 карточек", а "1 карточка", "2 карточки" и 5 "карточек". Т.е. к слову, связанному с целым количественным числительным хочется подобрать правильное окончание.
Можно заменить, что для целых количественных числительных максимально можно выделить три различных окончания.
Эти рассуждения привели меня к написанию следующей функции:
public static String pickPhrase(int count, String word0,String word1,String word2) {
int rem = count % 100;
if(rem < 11 || rem > 14){
rem = count % 10;
if(rem == 1) return word1;
if(rem >= 2 && rem <= 4) return word2;
} return word0;
}
Функция
pickPhrase принимает количество (
count) и три вида окончаний (
word0, word1, word2).
Мысленно можно выделить следующие группы:
0 карточ
ек, 5 карточ
ек, 6 карточ
ек и т.д.
1 карточ
ка, 21 карточ
ка, 31 карточ
ка и т.д.
2 карточ
ки, 3 карточ
ки, 4 карточ
ки и т.д.
Для удобства я взял окончания для 0, 1, 2, т.к. у них троих различные окончания.
Вам только остается подобрать окончания для 0, 1, 2, а функция по переданную количеству подберет требуемое окончание.
word0 - соответствует окончанию для 0-го количества;
word1 - соответствует окончанию с количеством в 1 штуку;
word2 - соответствует окончанию с количеством в 2 штуки.
Например:
Пусть дано кол-во карточек от 0 до 100 включительно и нужно к слову "карточка" подобрать окончание в соответствии с количеством.
Это делается так:
for (int i = 0; i <= 100; i++) {
System.out.println(i + " карточ" + pickPhrase(i, "ек", "ка", "ки"));
}
Мы выделили неизменяемую часть слова "карточ" и далее нашей функцией подобрали окончание.
0 карточек
1 карточка
2 карточки
3 карточки
4 карточки
5 карточек
6 карточек
7 карточек
8 карточек
9 карточек
10 карточек
11 карточек
12 карточек
...
96 карточек
97 карточек
98 карточек
99 карточек
100 карточек
Чтобы не выделить неизменяемую часть слова и не допустить ошибку при этом, можно вместо окончаний использовать сами слова. Например:
for (int i = 0; i <= 100; i++) {
System.out.println(i + " " + pickPhrase(i, "штук", "штука", "штуки"));
}
0 штук
1 штука
2 штуки
3 штуки
4 штуки
5 штук
6 штук
7 штук
8 штук
9 штук
10 штук
11 штук
12 штук
13 штук
...
90 штук
91 штука
92 штуки
93 штуки
94 штуки
95 штук
96 штук
97 штук
98 штук
99 штук
100 штук