fork download
  1. <?php
  2.  
  3. /**
  4.  * 05.05.2015 (20:17)
  5.  * TheNumbers.php
  6.  * PhpStorm
  7.  */
  8.  
  9. header("Content-Type: text/plain; charset=utf-8");
  10.  
  11. /* Делает первую букву предложения заглавной */
  12. function makeFirstLetterUppercase($input)
  13. {
  14. $firstLetter = mb_substr($input, 0, 1);
  15. $firstLetter = mb_strtoupper($firstLetter);
  16. $otherLetters = mb_substr($input, 1);
  17. $result = $firstLetter . $otherLetters;
  18. return $result;
  19. }
  20.  
  21. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  22. function inclineWord($input)
  23. {
  24. $lastSymbol = $input % 10;
  25. if ($lastSymbol == 1) {
  26. $result = ' рубль.';
  27. } elseif (($lastSymbol >= 2) && ($lastSymbol <= 4)) {
  28. $result = ' рубля.';
  29. } else {
  30. $result = ' рублей.';
  31. }
  32. return $result;
  33. }
  34.  
  35. /**
  36.  * Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  37.  * если мы считаем число для мужского рода (один рубль),
  38.  * и 1 — для женского (одна тысяча)
  39.  */
  40. function smallNumberToText($input, $isFemale)
  41. {
  42. $spelling = array(
  43. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  44. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  45. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  46. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  47. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  48. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  49. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  50. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  51. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  52. 9 => 'девять', 19 => 'девятнадцать'
  53. );
  54.  
  55. $femaleSpelling = array(
  56. 1 => 'одна',
  57. 2 => 'две',
  58. );
  59. /* Заменим значения в массиве spelling (для женского рода) */
  60. if ($isFemale == 1) {
  61. $spelling = array_replace($spelling, $femaleSpelling);
  62. }
  63.  
  64. $input = ltrim($input, 0); /* Удалим в начале все нули, если они есть */
  65. $flipped = array_flip($spelling); /* Поменяем ключи и значения ключей местами, чтобы использовать функцию array_search */
  66.  
  67. if (($input >= 0) && ($input <= 20)) {
  68. $result = array_search($input, $flipped);
  69. } elseif (($input >= 21) && ($input <= 99)) {
  70. if ($input % 10 == 0) {
  71. $result = array_search($input, $flipped);
  72. } else {
  73. $singleDigits = mb_substr($input, 1, 1); /* Выделяем из числа послению цифру (число 89, то $singleDigits = 9) */
  74. $tens = $input - $singleDigits; /* Вычитаем из начального числа значение переменной $singleDigits (число 89 - $singleDigits, то $tens = 80) */
  75. $tens = array_search($tens, $flipped);
  76. $singleDigits = array_search($singleDigits, $flipped);
  77. $result = $tens . " " . $singleDigits;
  78. }
  79. } elseif (($input >= 100) && ($input <= 999)) {
  80. if ($input % 100 == 0) {
  81. $result = array_search($input, $flipped);
  82. } else {
  83. $tens = mb_substr($input, 1, 2); /* Выделяем из числа посление две цифры (число 989, то $tens = 89) */
  84. $hundreds = $input - $tens; /* Вычитаем из начального числа значение переменной $tens (число 989 - $tens, то $hundreds = 900) */
  85. $singleDigits = mb_substr($tens, 1, 1); /* Выделяем последениею цифру из перемееной $tens (число 89, то $singleDigits = 9) */
  86. if (($tens % 10 == 0) || (($tens >= 0) && ($tens <= 20))) {
  87. $hundreds = array_search($hundreds, $flipped);
  88. $tens = array_search($tens, $flipped);
  89. $result = $hundreds . " " . $tens;
  90. } else {
  91. $tens = $tens - $singleDigits;
  92. $hundreds = array_search($hundreds, $flipped);
  93. $tens = array_search($tens, $flipped);
  94. $singleDigits = array_search($singleDigits, $flipped);
  95. $result = $hundreds . " " . $tens . " " . $singleDigits;
  96. }
  97. }
  98. }
  99. return $result;
  100. }
  101.  
  102. function numberToText($input)
  103. {
  104. $thousandSpelling = array(
  105. '1' => 'тысяча',
  106. '2' => 'тысячи',
  107. '3' => 'тысячь',
  108. );
  109.  
  110. $millionSpelling = array(
  111. '1' => 'миллион',
  112. '2' => 'миллиона',
  113. '3' => 'миллионов',
  114. );
  115.  
  116. $lengthNum = mb_strlen($input); /* Найдем длинну числа */
  117. $result = '';
  118. if (($lengthNum <= 8) && ($lengthNum >= 7)) {
  119. /* Разбиваем число */
  120. if ($lengthNum == 8) {
  121. $a = mb_substr($input, 0, 2);
  122. $b = mb_substr($input, 2, 3);
  123. $c = mb_substr($input, 5, 3);
  124. } elseif ($lengthNum == 7) {
  125. $a = mb_substr($input, 0, 1);
  126. $b = mb_substr($input, 1, 3);
  127. $c = mb_substr($input, 4, 3);
  128. }
  129. /* Преобразуем разбитые числа в текст */
  130. $aText = smallNumberToText($a, 0);
  131. $bText = smallNumberToText($b, 1);
  132. $cText = smallNumberToText($c, 0);
  133. /* Преобразуем миллионы в текст */
  134. $millions = '';
  135. if (($a >= 11) && ($a <= 14)) {
  136. $millions .= $aText . " " . $millionSpelling[3] . " " . $bText;
  137. } else {
  138. $lastDigits = $a % 10;
  139. if ($lastDigits == 1) {
  140. $millions .= $aText . " " . $millionSpelling[1] . " " . $bText;
  141. } elseif (($lastDigits >= 2) && ($lastDigits <= 4)) {
  142. $millions .= $aText . " " . $millionSpelling[2] . " " . $bText;
  143. } else {
  144. $millions .= $aText . " " . $millionSpelling[3] . " " . $bText;
  145. }
  146. }
  147. /* Преобразуем тысячи в текст */
  148. $b = $b % 10;
  149. if ($b == 1) {
  150. $thousand = $thousandSpelling[1];
  151. } elseif (($b > 1) && ($b <= 4)) {
  152. $thousand = $thousandSpelling[2];
  153. } else {
  154. $thousand = $thousandSpelling[3];
  155. }
  156. /* Соединяем миллионы и тысячи */
  157. $result = $millions . " " . $thousand . " " . $cText;
  158. } elseif (($lengthNum <= 6) && ($lengthNum >= 4)) {
  159. /* Разбиваем число */
  160. if ($lengthNum == 6) {
  161. $a = mb_substr($input, 0, 3);
  162. $b = mb_substr($input, 3, 3);
  163. } elseif ($lengthNum == 5) {
  164. $a = mb_substr($input, 0, 2);
  165. $b = mb_substr($input, 2, 3);
  166. } elseif ($lengthNum == 4) {
  167. $a = mb_substr($input, 0, 1);
  168. $b = mb_substr($input, 1, 3);
  169. }
  170. /* Преобразуем разбитые числа в текст */
  171. $aText = smallNumberToText($a, 1);
  172. $bText = smallNumberToText($b, 0);
  173. /* Преобразуем тысячи в текст */
  174. if ($a % 10 == 1) {
  175. $thousand = $thousandSpelling[1];
  176. } elseif (($a % 10 > 1) && ($a % 10 <= 4)) {
  177. $thousand = $thousandSpelling[2];
  178. } else {
  179. $thousand = $thousandSpelling[3];
  180. }
  181. /* Соединяем тысячи и сотни */
  182. $result = $aText . " " . $thousand . " " . $bText;
  183. } elseif ($lengthNum <= 3) {
  184. $result = smallNumberToText($input, 0);
  185. }
  186. $result = makeFirstLetterUppercase($result);
  187. $ending = inclineWord($input);
  188. $result .= $ending;
  189. return $result;
  190. }
  191.  
  192. $amount = 11011011;
  193. $text = numberToText($amount);
  194. echo "На вашем счету: {$text} ({$amount})\n";
  195.  
  196. $amount = mt_rand(1000, 9999);
  197. $text = numberToText($amount);
  198. echo "На вашем счету: {$text} ({$amount})\n";
  199.  
  200. $amount = mt_rand(10000, 99999);
  201. $text = numberToText($amount);
  202. echo "На вашем счету: {$text} ({$amount})\n";
  203.  
  204. $amount = mt_rand(100000, 999999);
  205. $text = numberToText($amount);
  206. echo "На вашем счету: {$text} ({$amount})\n";
  207.  
  208. $amount = mt_rand(1000000, 9999999);
  209. $text = numberToText($amount);
  210. echo "На вашем счету: {$text} ({$amount})\n";
  211.  
  212. $amount = mt_rand(10000000, 99999999);
  213. $text = numberToText($amount);
  214. echo "На вашем счету: {$text} ({$amount})\n";
Success #stdin #stdout 0.02s 24448KB
stdin
Standard input is empty
stdout
На вашем счету: Одиннадцать миллионов одиннадцать тысяча одиннадцать рубль. (11011011)
На вашем счету: Семь тысячь четыреста девятнадцать рублей. (7419)
На вашем счету: Тридцать восемь тысячь шестьсот семьдесят девять рублей. (38679)
На вашем счету: Шестьсот двадцать шесть тысячь сто сорок один рубль. (626141)
На вашем счету: Четыре миллиона триста девяносто девять тысячь сто семьдесят один рубль. (4399171)
На вашем счету: Сорок семь миллионов семьсот тридцать три тысячи девятьсот сорок шесть рублей. (47733946)