fork download
  1. <?php
  2.  
  3.  
  4. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 тысячи, 5 миллионов */
  5. function inclineWord($numbers, $isFemale, $key) {
  6.  
  7. $spelling = [
  8. 0 => [0 => 'рубль', 1 => 'рубля', 2 => 'рублей'],
  9. 1 => [0 => 'тысяча', 1 => 'тысячи', 2 => 'тысяч'],
  10. 2 => [0 => 'миллион', 1 => 'миллиона', 2 => 'миллионов'],
  11. ];
  12.  
  13. if (arrayCheck($numbers)) {
  14. $numbers = array_reverse(combineNumbers(array_reverse($numbers)));
  15. }
  16.  
  17. if ($numbers[0] == 1) {
  18. $word = $spelling[$key][0];
  19. } elseif ($numbers[0] >= 2 && $numbers[0] <= 4) {
  20. $word = $spelling[$key][1];
  21. } elseif ($numbers[0] >= 5 && $numbers[0] <= 9 || $numbers[0] >= 11 && $numbers[0] <= 19 || $numbers[0] == 0) {
  22. $word = $spelling[$key][2];
  23. }
  24.  
  25. return $word;
  26. }
  27.  
  28. /* Соединяет особенные числа */
  29. function combineNumbers($numbers) {
  30. $keys = (count($numbers) == 4) ? [1, 2] : ((count($numbers) == 3) ? [0, 1] : null);
  31.  
  32. if ($keys) {
  33. if (($numbers[$keys[0]] == 1) && ($numbers[$keys[1]] >= 1) && ($numbers[$keys[1]] <= 9)) {
  34. $numbers[$keys[0]] *= 10 + $numbers[$keys[1]];
  35. unset($numbers[$keys[1]]);
  36. }
  37. }
  38.  
  39. return $numbers;
  40. }
  41.  
  42. /*
  43.   Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  44.   если мы считаем число для мужского рода (один рубль),
  45.   и 1 — для женского (одна тысяча)
  46. */
  47. function smallNumberToText($numbers, $isFemale ,$length) {
  48.  
  49. $spelling = [
  50. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  51. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  52. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  53. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  54. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  55. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  56. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  57. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  58. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  59. 9 => 'девять', 19 => 'девятнадцать'
  60. ];
  61.  
  62. if ($isFemale) {
  63. $femaleSpelling = [
  64. 1 => 'одна',
  65. 2 => 'две'
  66. ];
  67.  
  68. $spelling = array_replace($spelling, $femaleSpelling);
  69. }
  70.  
  71. if (arrayCheck($numbers)) {
  72. $numbers = combineNumbers(array_reverse($numbers));
  73. }
  74. unset($numbers['remainder']);
  75.  
  76. $multiplierAndKey = (count($numbers) == 3) ? [100, 3] : ((count($numbers) == 2) ? (($length == 4) ? [100, 2] : [10, 2]) : [1, 1]);
  77.  
  78. for ($i = 0; $i < $multiplierAndKey[1]; $i++) {
  79. if ($numbers[$i] != 0) {
  80. $words[] = $spelling[$numbers[$i] * $multiplierAndKey[0]];
  81. } else {
  82. $words[] = null;
  83. }
  84. $multiplierAndKey[0] = ($length == 4 && count($numbers) == 2) ? 1 : $multiplierAndKey[0] / 10;
  85. }
  86.  
  87. return $words;
  88. }
  89.  
  90. /* Разделяет число на массивы с числами */
  91. function divideNumber($number, $minIteration, $maxIteration) {
  92. for ($i = $minIteration; $i < $maxIteration; $i++) {
  93. if ($number) {
  94. $numbers[] = $number % 10;
  95. $number = floor($number / 10);
  96. $numbers['remainder'] = $number;
  97. } elseif ($number == 0) {
  98. $numbers[] = null;
  99. }
  100. }
  101.  
  102. return $numbers;
  103. }
  104.  
  105. /* Проверяет массив на наличие реальных значений */
  106. function arrayCheck($array) {
  107. $result = 0;
  108. foreach ($array as $variable) {
  109. if ($variable != null) {
  110. $result = 1;
  111. }
  112. }
  113.  
  114. return $result;
  115. }
  116.  
  117. function numberToText($number) {
  118.  
  119. /*
  120.   $key - номер ключа массива
  121.   $min - мин. кол-во интераций
  122.   $max - макс. кол-во итераций
  123.   */
  124.  
  125. for ($key = 0, $min = 0, $max = 3; $max <= 9; $key++, $min += 3, $max += 3) {
  126.  
  127. if (!empty($numbers[$key - 1]['remainder']) || $key == 0) {
  128.  
  129. if (!isset($numbers)) {
  130. $numbers[$key] = divideNumber($number, $min, $max);
  131. } else {
  132. $numbers[$key] = divideNumber($numbers[$key - 1]['remainder'], $min, $max);
  133. }
  134.  
  135. $isFemale = 0;
  136. if ($numbers[$key][0] == 1 && $key == 1 || $numbers[$key][0] == 2 && $key == 1) {
  137. $isFemale = 1;
  138. }
  139.  
  140. $inclinedWords[$key] = inclineWord($numbers[$key], $isFemale, $key);
  141. $words[$key] = smallNumberToText($numbers[$key], $isFemale, count($numbers[$key]));
  142.  
  143. if ($key == 0) {
  144. if (arrayCheck($words[$key])) {
  145. $text = implode(' ', $words[$key]);
  146. }
  147. if (isset($text)) {
  148. $text = $text.' '."($number)".' '.$inclinedWords[$key];
  149. } else {
  150. $text = "($number)".' '.$inclinedWords[$key];
  151. }
  152. } else {
  153. if (arrayCheck($words[$key])) {
  154. $text = implode(' ', $words[$key]).' '.$inclinedWords[$key].' '.$text;
  155. }
  156.  
  157. }
  158.  
  159. }
  160.  
  161. }
  162.  
  163. return $text;
  164. }
  165.  
  166. /* Вызовем функцию несколько раз */
  167. for ($i = 0; $i < 5; $i++) {
  168. $amount[$i] = mt_rand(0, 999999999);
  169. $text[$i] = numberToText($amount[$i]);
  170. echo "На вашем счету: {$text[$i]}\n";
  171. }
Success #stdin #stdout 0.02s 23904KB
stdin
Standard input is empty
stdout
На вашем счету: пятьсот восемьдесят три миллиона двести сорок восемь тысяч четыреста тринадцать (583248413) рублей
На вашем счету: сто  пять миллионов пятьсот восемьдесят  (105000580) рублей
На вашем счету: двести восемьдесят три миллиона восемьсот сорок восемь тысяч сто семьдесят четыре (283848174) рубля
На вашем счету:  семьдесят  миллионов четыреста пятьдесят  тысяч семьсот шестьдесят  (70450760) рублей
На вашем счету: восемьсот  шесть миллионов четыреста  три тысячи триста девяносто шесть (806403396) рублей