Whois-сервисы

Служба Whois
Служба Whats
Служба Hoster
Служба Whois History
Служба IP Lookup
Служба GEO IP Lookup
Служба DNSBL Lookup
Служба DNS Watch
Служба Reverse IP






Число прописью средствами 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-2026, wb0.ru