Pull to refresh

Русский без роботизма, часть 1

Reading time 2 min
Views 2K
Я всецело за чистоту и правильное использование русского языка. В жизни вообще и в рунете в частности. Ибо от надписей вроде «23 штука» или усреднённых вариантов «23 шт.» мягко говоря коробит.

Поэтому, когда встала задача побороть роботизм в окончаниях существительных, была разработана и реализована соответствующая функция (вернее сказать плагин для Smarty).

Основывается функция на правиле — всего есть 3 варианта (иногда меньше) окончаний существительных для любых русских слов, используемых с числом:

  • Если последняя цифра числа — 1 (но не 11)
  • Если последняя цифра числа — 2,3,4 (но не *12,*13,*14)
  • Все остальные случаи.


Естественно, получив эту закономерность, написать код не составило труда.

Copy Source | Copy HTML
  1.  /**
  2. * Smarty {number2word} function plugin
  3. *
  4. * Type: function* Name: number2word* Purpose: Get russian (or other lang) word equivalent to current number of items
  5. * @author Beresnev Sergey
  6. * @param array
  7. * @param Smarty
  8. */
  9.  function smarty_function_number2word($params, &$smarty)
  10.  {
  11.  if (!isset($params['number'])) {
  12.  $smarty->trigger_error("numbertoword: Отсутствует параметр 'number'");
  13.  return;
  14.  }
  15.  if (!isset($params['name1']) or !isset($params['name2']) or !isset($params['name3'])) {
  16.  $smarty->trigger_error("numbertoword: Отсутствуют параметры 'name1' или 'name2' или 'name3'");
  17.  return;
  18.  }
  19.  $temp = strval($params['number']);
  20.  $temp = $temp[utf8_strlen($temp)-1];
  21.  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']));
  22.  }


После этого в шаблоне достаточно указать конструкцию вида
{number2word number=$your_number name1=Строка name2=Строки name3=Строк}

З.Ы. Спасибо за поправку на счёт *10-*20
Tags:
Hubs:
+11
Comments 53
Comments Comments 53

Articles