Число прописью средствами PHP. Статьи. wb0.ru - Все для веб-мастера, on-line сервисы

Число прописью средствами PHP

В статье рассмотрен пример функции на языке PHP, формирующей числительные для использования с существительными мужского и женского рода. Такая функция может пригодиться для автоматического формирования счетов, договоров, актов или сообщений на сайте. На оригинальность или новизну не претендую, очевидно, что аналигичные решения существуют давно.

В русском языке существительное, употребляемое вместе с числительным, имеет три формы. Рассмотрим пример:

  • один друг
  • два друга
  • три друга
  • четыре друга
  • пять друзей
  • ...
  • сто один друг.
Мы видим, что три различных формы существительного отвечают числительным 1,2 и 5. Кроме того, числительные для существительных женского рода другие, см. пример ниже:
  • одна подруга
  • две подруги
  • три подруги
  • четыре подруги
  • пять подруг
  • ...
  • сто одна подруга.
Женский род числительных требуется даже для описания существительных мужского рода, так как слово <тысяча> - слово женского рода.

Функция written_number(), приведенная ниже, имеет два аргумента. Первый аргумент - целое неотрицательное число (меньше миллиарда), второй - род (0 - мужской, 1 женский).

  1. <?php
  2. global $N0, $Ne0, $Ne1, $Ne2, $Ne3, $Ne6;
  3.  
  4. $N0 = 'ноль';
  5.  
  6. $Ne0 = array(
  7.              0 => array('','один','два','три','четыре','пять','шесть',
  8.                         'семь','восемь','девять','десять','одиннадцать',
  9.                         'двенадцать','тринадцать','четырнадцать','пятнадцать',
  10.                         'шестнадцать','семнадцать','восемнадцать','девятнадцать'),
  11.              1 => array('','одна','две','три','четыре','пять','шесть',
  12.                         'семь','восемь','девять','десять','одиннадцать',
  13.                         'двенадцать','тринадцать','четырнадцать','пятнадцать',
  14.                         'шестнадцать','семнадцать','восемнадцать','девятнадцать')
  15.              );
  16.  
  17. $Ne1 = array('','десять','двадцать','тридцать','сорок','пятьдесят',
  18.              'шестьдесят','семьдесят','восемьдесят','девяносто');
  19.  
  20. $Ne2 = array('','сто','двести','триста','четыреста','пятьсот',
  21.              'шестьсот','семьсот','восемьсот','девятьсот');
  22.  
  23. $Ne3 = array(1 => 'тысяча', 2 => 'тысячи', 5 => 'тысяч');
  24.  
  25. $Ne6 = array(1 => 'миллион', 2 => 'миллиона', 5 => 'миллионов');
  26.  
  27. function written_number($i, $female=false) {
  28.   global $N0;
  29.   if ( ($i<0) || ($i>=1e9) || !is_int($i) ) {
  30.     return false; // Аргумент должен быть неотрицательным целым числом, не превышающим 1 миллион
  31.   }
  32.   if($i==0) {
  33.     return $N0;
  34.   }
  35.   else {
  36.     return preg_replace( array('/s+/','/\s$/'),
  37.                          array(' ',''),
  38.                          num1e9($i, $female));
  39.     return num1e9($i, $female);
  40.   }
  41. }
  42.  
  43. function num_125($n) {
  44.   /* форма склонения слова, существительное с числительным склоняется
  45.    одним из трех способов: 1 миллион, 2 миллиона, 5 миллионов */
  46.   $n100 = $n % 100;
  47.   $n10 = $n % 10;
  48.   if( ($n100 > 10) && ($n100 < 20) ) {
  49.     return 5;
  50.   }
  51.   elseif( $n10 == 1) {
  52.     return 1;
  53.   }
  54.   elseif( ($n10 >= 2) && ($n10 <= 4) ) {
  55.     return 2;
  56.   }
  57.   else {
  58.     return 5;
  59.   }
  60. }
  61.  
  62. function num1e9($i, $female) {
  63.   global $Ne6;
  64.   if($i<1e6) {
  65.     return num1e6($i, $female);
  66.   }
  67.   else {
  68.     return num1000(intval($i/1e6), false) . ' ' .
  69.       $Ne6[num_125(intval($i/1e6))] . ' ' . num1e6($i%1e6, $female);
  70.   }
  71. }
  72.  
  73. function num1e6($i, $female) {
  74.   global $Ne3;
  75.   if($i<1000) {
  76.     return num1000($i, $female);
  77.   }
  78.   else {
  79.     return num1000(intval($i/1000), true) . ' ' .
  80.       $Ne3[num_125(intval($i/1000))] . ' ' . num1000($i%1000, $female);
  81.   }
  82. }
  83.  
  84. function num1000($i, $female) {
  85.   global $Ne2;
  86.   if( $i<100) {
  87.     return num100($i, $female);
  88.   }
  89.   else {
  90.     return $Ne2[intval($i/100)] . (($i%100)?(' '. num100($i%100, $female)):'');
  91.   }
  92. }
  93.  
  94. function num100($i, $female) {
  95.   global $Ne0, $Ne1;
  96.   $gender = $female?1:0;
  97.   if ($i<20) {
  98.     return $Ne0[$gender][$i];
  99.   }
  100.   else {
  101.     return $Ne1[intval($i/10)] . (($i%10)?(' ' . $Ne0[$gender][$i%10]):'');
  102.   }
  103. }
  104.  
  105. ?>

Рассмотрим примеры использования функции written_number():

$ruble = array(1 => 'рубль', 2 => 'рубля', 5 => 'рублей');
$sum = 21802;
echo 'Всего оказано услуг на сумму: '
    .  written_number($sum) . ' ' . $ruble[num_125($sum)] . ' 00 коп.';
$friendm = array(1 => 'друг', 2 => 'друга', 5 => 'друзей');
$friendf = array(1 => 'подруга', 2 => 'подруги', 5 => 'подруг');
$m_count = 11;
$f_count = 21;
echo 'У пользователя ' . written_number($m_count) . ' ' . $friendm[num_125($m_count)]
    . ' и ' . written_number($f_count, true) . ' ' . $friendf[num_125($f_count)] . '.';

Дата публикации: 15.08.2010
Григорий Рубцов,
webew.ru

   Ваш псевдоним:
Ваш комментарий:

Календарь событий


Новости Интернет


Поиск





Последний пересчет

тИЦ:07 Окт 15
PR:09 Дек 13

Наши партнеры

wservices.ru - регистрация доменов, Whois-сервисы Смайлы на все случаи жизни


 
Copyright © 2006-2024, wb0.ru