Я всецело за чистоту и правильное использование русского языка. В жизни вообще и в рунете в частности. Ибо от надписей вроде «23 штука» или усреднённых вариантов «23 шт.» мягко говоря коробит.
Поэтому, когда встала задача побороть роботизм в окончаниях существительных, была разработана и реализована соответствующая функция (вернее сказать плагин для Smarty).
Основывается функция на правиле — всего есть 3 варианта (иногда меньше) окончаний существительных для любых русских слов, используемых с числом:
Естественно, получив эту закономерность, написать код не составило труда.
После этого в шаблоне достаточно указать конструкцию вида
З.Ы. Спасибо за поправку на счёт *10-*20
Поэтому, когда встала задача побороть роботизм в окончаниях существительных, была разработана и реализована соответствующая функция (вернее сказать плагин для Smarty).
Основывается функция на правиле — всего есть 3 варианта (иногда меньше) окончаний существительных для любых русских слов, используемых с числом:
- Если последняя цифра числа — 1 (но не 11)
- Если последняя цифра числа — 2,3,4 (но не *12,*13,*14)
- Все остальные случаи.
Естественно, получив эту закономерность, написать код не составило труда.
Copy Source | Copy HTML
- /**
- * Smarty {number2word} function plugin
- *
- * Type: function* Name: number2word* Purpose: Get russian (or other lang) word equivalent to current number of items
- * @author Beresnev Sergey
- * @param array
- * @param Smarty
- */
- function smarty_function_number2word($params, &$smarty)
- {
- if (!isset($params['number'])) {
- $smarty->trigger_error("numbertoword: Отсутствует параметр 'number'");
- return;
- }
- if (!isset($params['name1']) or !isset($params['name2']) or !isset($params['name3'])) {
- $smarty->trigger_error("numbertoword: Отсутствуют параметры 'name1' или 'name2' или 'name3'");
- return;
- }
- $temp = strval($params['number']);
- $temp = $temp[utf8_strlen($temp)-1];
- return (($temp>1 and $temp <5 and (intval($params['number']%100)>19 or intval($params['number']%100)<10))?$params['name2']:($temp==1?$params['name1']:$params['name3']));
- }
После этого в шаблоне достаточно указать конструкцию вида
{number2word number=$your_number name1=Строка name2=Строки name3=Строк}
З.Ы. Спасибо за поправку на счёт *10-*20