fork(2) download
  1. <?php
  2.  
  3.  
  4. $end = array(
  5. 0 => array(
  6. 0 => "миллион",
  7. 1 => "миллиона",
  8. 2 => "миллионов"
  9. ),
  10. 1 => array(
  11. 0 => "тысяча",
  12. 1 => "тысячи",
  13. 2 => "тысяч"
  14. ),
  15. 2 => array(
  16. 0 => "рубль",
  17. 1 => "рубля",
  18. 2 => "рублей"
  19. )
  20. );
  21.  
  22. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  23. function inclineWord($latterFigure, $end) {
  24.  
  25. if ($latterFigure == 1){
  26. $word = $end[0];
  27. } elseif (($latterFigure >= 2) && ($latterFigure <= 4)) {
  28. $word = $end[1];
  29. } else {
  30. $word = $end[2];
  31. }
  32.  
  33. return $word;
  34. }
  35.  
  36. function writeThousand($declension, $discharge, $spelling) {
  37.  
  38. if (($discharge == 1) && ($declension == 1)) {
  39. return 'одна';
  40. } elseif (($discharge == 2) && ($declension == 1)) {
  41. return 'две';
  42. } else {
  43. return $spelling[$discharge];
  44. }
  45. }
  46.  
  47. //разбивает число на миллионы, тысяча и сотни
  48. function splitToParts($number) {
  49.  
  50. $hundred = $number % 1000;
  51.  
  52.  
  53. $thousand = $number % 1000000 / 1000;
  54. $thousand = floor($thousand);
  55.  
  56. $million = $number % 1000000000 / 1000000;
  57. $million = floor ($million);
  58.  
  59. $level = array(
  60. 0 => $million,
  61. 1 => $thousand,
  62. 2 => $hundred
  63. );
  64.  
  65. return $level;
  66. }
  67.  
  68. //переводит числовое число в текстовое
  69. function smallNumberToText($number, $end) {
  70.  
  71. $spelling = array(
  72. 0 => 'ноль',
  73. 1 => 'один',
  74. 2 => 'два',
  75. 3 => 'три',
  76. 4 => 'четыре',
  77. 5 => 'пять',
  78. 6 => 'шесть',
  79. 7 => 'семь',
  80. 8 => 'восемь',
  81. 9 => 'девять',
  82. 10 => 'десять',
  83. 11 => 'одиннадцать',
  84. 12 => 'двенадцать',
  85. 13 => 'тринадцать',
  86. 14 => 'четырнадцать',
  87. 15 => 'пятнадцать',
  88. 16 => 'шестнадцать',
  89. 17 => 'семнадцать',
  90. 18 => 'восемнадцать',
  91. 19 => 'девятнадцать',
  92. 20 => 'двадцать',
  93. 30 => 'тридцать',
  94. 40 => 'сорок',
  95. 50 => 'пятьдесят',
  96. 60 => 'шестьдесят',
  97. 70 => 'семьдесят',
  98. 80 => 'восемьдесят',
  99. 90 => 'девяносто',
  100. 100 => 'сто',
  101. 200 => 'двести',
  102. 300 => 'триста',
  103. 400 => 'четыреста',
  104. 500 => 'пятьсот',
  105. 600 => 'шестьсот',
  106. 700 => 'семьсот',
  107. 800 => 'восемьсот',
  108. 900 => 'девятьсот',
  109. );
  110.  
  111. $level = splitToParts($number);
  112.  
  113. $text = "";
  114.  
  115. foreach($level as $declension => $discharge) {
  116.  
  117. if ($number == 0) {
  118. $text = " ноль рублей";
  119. }
  120.  
  121. if ($discharge != 0) {
  122. $aboveZero = true;
  123. }
  124.  
  125. //сохранение последней цифры для возвращения слова
  126. if (($discharge % 100 >= 10) && ($discharge % 100 <= 19)) {
  127. $latterFigure = $discharge % 100;
  128. } else {
  129. $latterFigure = $discharge % 10;
  130. }
  131.  
  132. if (($discharge >= 100) && ($discharge <= 999)) {
  133. $numberInArray = floor($discharge / 100) * 100;
  134. $text = $text.' '.$spelling[$numberInArray];
  135. $discharge = $discharge % 100;
  136. }
  137.  
  138. if (($discharge >= 10) && ($discharge <= 19)) {
  139.  
  140. $numberInArray = $discharge;
  141. $text = $text.' '.$spelling[$numberInArray];
  142.  
  143. } elseif ($discharge != 0) {
  144.  
  145. if ($discharge <= 9 || $discharge % 10 == 0) {
  146. $i = 1;
  147. } else {
  148. $i = 2;
  149. }
  150.  
  151. switch ($i) {
  152. case 1:
  153. $text = $text.' '.writeThousand($declension, $discharge, $spelling);
  154. break;
  155. case 2:
  156. $numberInArray = floor($discharge / 10) * 10;
  157. $text = $text.' '.$spelling[$numberInArray];
  158. $discharge = $discharge % 10;
  159. $text = $text.' '.writeThousand($declension, $discharge, $spelling);
  160. }
  161. } elseif ($declension == 2 && $discharge == 0 && $number != 0) {
  162. $text = $text.' рублей';
  163. }
  164.  
  165. if ($aboveZero == true) {
  166. $word = inclineWord($latterFigure, $end[$declension]);
  167. $text = $text.' '.$word;
  168. $aboveZero = false;
  169. }
  170. }
  171. return $text;
  172. }
  173.  
  174. $number = mt_rand(0, 999999999);
  175. $number = smallNumberToText($number, $end);
  176. echo "На вашем счету{$number}\n";
Success #stdin #stdout 0.03s 52480KB
stdin
Standard input is empty
stdout
На вашем счету восемьдесят семь миллионов пятьсот восемнадцать тысяч пятьсот девяносто два рубля