В корзине 7 товаров или Учимся склонять правильно
2009.10.03Программистам иногда приходится писать код, который будет выводить пользователю что-то вроде «В корзине 7 товаров». Самый простой способ – это написать «В корзине 7 товар[а,ов]», что не отличается ни красотой, ни удобством прочтения. Взгляд самовольно задерживается на таких скобочках. Есть способ лучше – автоматически склонять слова, указав зависимость окончаний слов от цифр. Тут все очень просто на самом деле.
Существительные
Начнем с существительных в родительном падеже, потому что чаще всего встречается необходимость склонять именно этих несчастных. Практически все слова склоняются в зависимости от последней цифры, за исключением чисел с единицей на предпоследнем месте. Варианты склонения представлены в таблице ниже.
Условия |
«Товар» |
«Позиция» |
«Сайт» |
«Птичка» |
Примеры чисел |
..0, ..5, ..6, ..7, ..8, ..9; ..11, ..12, ..13, ..14 |
товаров |
позиций |
сайтов |
птичек |
7, 105, 111, 1007, 2012 |
..1 (кроме ..11) |
товар |
позиция |
сайт |
птичка |
1, 51, 101, 761, 1001 |
..2, ..3, ..4 (кроме ..12, ..13, ..14) |
товара |
позиции |
сайта |
птички |
2, 32, 64, 404, 1234 |
Вот то же самое, но сразу для PHP. Пусть у нас
$c
– это изменяющееся число, а нам надо написать фразу как в заголовке поста.
echo 'В корзине '.$c;
$a = substr($c, strlen($c)-1, 1); # Это последний символ
$b = substr($c, strlen($c)-2, 2); # Это два последних символа
if ($a==0 or ($a>=5 and $a<=9) or ($b>=11 and $b<=14)) echo ' товаров.';
if ($a==1 and $b!=11) echo ' товар.';
if ($a>=2 and $a<=4 and $b!=12 and $b!=13 and $b!=14) echo ' товара.';
Глаголы
С глаголами все еще проще, тут вообще только два варианта, хотя постоянно кажется, что что-то упустил.
Условия |
«Добавлять его» |
«Добавлять ее» |
Примеры чисел |
..1 (кроме ..11) |
добавлен |
добавлена |
1, 101 |
все остальное и ..11 |
добавлено |
добавлено |
11, 105 |
Теперь полный кусок PHP-кода для вывода фразы типа «В корзину добавлено 7 товаров».:
echo 'В корзину ';
$a = substr($c, strlen($c)-1, 1); # Это последний символ
$b = substr($c, strlen($c)-2, 2); # Это два последних символа
if ($a==1 and $b!=11) echo ' добавлен ';
if ($a!=1 or $b==11) echo ' добавлено ';
echo $c;
if ($a==0 or ($a>=5 and $a<=9) or ($b>=11 and $b<=14)) echo ' товаров.';
if ($a==1 and $b!=11) echo ' товар.';
if ($a>=2 and $a<=4 and $b!=12 and $b!=13 and $b!=14) echo ' товара.';
Вот пример отработки такого PHP-кода (
исходник):
Страницу можно обновить, тогда поменяются числа и, соответственно, поменяются и окончанию у слов.
Следующий пост: Оптимизация фотогалереи (#52, 2009.10.08)Предыдущий пост: Обклейка Vitz свершилась! (#50, 2009.09.15)Пост #51. Постоянная ссылка на пост: https://exogens.ru/blog/post/v-korzine-7-tovarov-ili-uchimsya-sklonyat-pravilno/