fork download
  1. <?php
  2. header("Content-Type: text/plain");
  3.  
  4.  
  5. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  6. function inclineWord($number, $word) {
  7.  
  8. if (($number % 10 >= 5) |
  9. ($number % 10 < 5 & $number % 100 < 21)) {
  10.  
  11. $incline=5;
  12.  
  13. } elseif (($number % 10 == 2 & $number % 100 != 12) |
  14. ($number % 10 == 3 & $number % 100 != 13) |
  15. ($number % 10 == 4 & $number % 100 != 14)) {
  16.  
  17. $incline=2;
  18.  
  19. } elseif ($number % 10 == 1 & $number % 100 != 11) {
  20.  
  21. $incline=1;
  22. }
  23.  
  24. if ($incline == 5 ) {
  25. $word = str_replace('миллион', 'миллионов', $word);
  26. $word = str_replace('тысяча', 'тысяч', $word);
  27. $word = str_replace('рубль', 'рублей', $word);
  28. } elseif ($incline == 2 ) {
  29. $word = str_replace('миллион', 'миллиона', $word);
  30. $word = str_replace('тысяча', 'тысячи', $word);
  31. $word = str_replace('рубль', 'рубля', $word);
  32. } elseif ($incline == 1 ) {
  33. $word = str_replace('миллион', 'миллион', $word);
  34. $word = str_replace('тысяча', 'тысяча', $word);
  35. $word = str_replace('рубль', 'рубль', $word);
  36. } elseif ($incline == 0 ) {
  37. $word = str_replace('рубль', 'рублей', $word);
  38. }
  39.  
  40. return $word;
  41.  
  42. }
  43.  
  44. /*
  45.   Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  46.   если мы считаем число для мужского рода (один рубль),
  47.   и 1 — для женского (одна тысяча)
  48. */
  49. function smallNumberToText($number, $isFemale) {
  50.  
  51. $spelling = array(
  52. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  53. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  54. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  55. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  56. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  57. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  58. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  59. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  60. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  61. 9 => 'девять', 19 => 'девятнадцать'
  62. );
  63.  
  64. $femaleSpelling = array(
  65. 1 => 'одна', 2 => 'две'
  66. );
  67.  
  68. //нормализация числа
  69. $number = ($number/100)*100;
  70.  
  71. if ($number>=100) {
  72.  
  73. if (($number % 100)==0) {
  74. $number000 = strtr($number, $spelling);
  75. $text = $number000;
  76. } else {
  77.  
  78. $number000 = (floor($number/100))*100;
  79. $number000 = strtr($number000, $spelling);
  80.  
  81. $number00 = $number % 100;
  82.  
  83. if ($number00>19) {
  84.  
  85. if (($number % 10)==0) {
  86. $number00 = strtr($number00, $spelling);
  87. } else {
  88. $number00 = (floor($number00/10))*10;
  89. $number00 = strtr($number00, $spelling);
  90.  
  91. $number0 = $number % 10;
  92. if ($isFemale==1 & $number0 <=2) {
  93. $number0 = strtr($number0, $femaleSpelling);
  94. } else {
  95. $number0 = strtr($number0, $spelling);
  96. }
  97. $number00 = $number00 . " " . $number0;
  98. }
  99.  
  100. } elseif ($number00<=19) {
  101.  
  102. if ($isFemale==1 & $number00 <=2) {
  103. $number00 = strtr($number00, $femaleSpelling);
  104. } else {
  105. $number00 = strtr($number00, $spelling);
  106. }
  107. }
  108.  
  109. $number000 = $number000 . " " . $number00;
  110. }
  111. $text = $number000 ;
  112.  
  113. }elseif ($number>19 & $number<100) {
  114.  
  115. if (($number % 10)==0) {
  116. $number00 = strtr($number, $spelling);
  117.  
  118. } else {
  119. $number00 = (floor($number/10))*10;
  120. $number00 = strtr($number00, $spelling);
  121.  
  122. $number0 = $number % 10;
  123. if ($isFemale==1 & $number0 <=2) {
  124. $number0 = strtr($number0, $femaleSpelling);
  125. } else {
  126. $number0 = strtr($number0, $spelling);
  127. }
  128. $number00 = $number00 . " " . $number0;
  129. }
  130. $text = $number00;
  131.  
  132. } elseif ($number<=19) {
  133.  
  134. if ($isFemale==1 & $number <=2) {
  135. $number = strtr($number, $femaleSpelling);
  136. } else {
  137. $number = strtr($number, $spelling);
  138. }
  139. $text = $number;
  140. }
  141. return $text;
  142. }
  143.  
  144. // проверяем чмсло на разрядность
  145. function bitNumber ($number) {
  146. $bitNumber = 1;
  147. while ($number>=10) {
  148. $number = $number/10;
  149. $bitNumber++;
  150. }
  151. //echo "$bitNumber\n";
  152. return $bitNumber;
  153. }
  154.  
  155. function numberToText($number) {
  156.  
  157. $text="";
  158. $bitNumber = bitNumber ($number); // определяем кол-во разрядов в числе
  159. $position = 0; // текущее положение каретки = 0
  160.  
  161. // продолжаем вакханалию пока положение каретки < количества символов //1234567
  162. while ($position < mb_strlen($number)) {
  163.  
  164. if (((mb_strlen($number) - $position) % 3) == 0 ) { // кратно трем
  165. $len = 3;
  166. } elseif (mb_strlen($number) < 3) { // меньше 1000
  167. $len = mb_strlen($number);
  168. } elseif (mb_strlen($number) > 3) { // больше 1000
  169. $len = mb_strlen($number) - (floor(mb_strlen($number)/3) * 3);
  170. }
  171.  
  172. //отняимес слева $количество_символов -> переименовываем в согласно разряду
  173. $pieceNumber = mb_substr($number, $position, $len);
  174. $word = smallNumberToText($pieceNumber, $bitNumber);
  175.  
  176. // распределяем по порядку разрядов и добавляем миллион, тысяч и рублей
  177. if ($bitNumber >= 7) {
  178. $word = smallNumberToText($pieceNumber, 0) . " " . "миллион";
  179. } elseif ($bitNumber >= 4) {
  180. $word = smallNumberToText($pieceNumber, 1) . " " . "тысяча";
  181. } elseif ($bitNumber < 4) {
  182. $word = smallNumberToText($pieceNumber, 0) . " " . "рубль";
  183. }
  184. // отправляем число 265 в функция_склонения
  185. $word = inclineWord($pieceNumber, $word);
  186.  
  187. //уменьшаем разряд на $количество отнятых символов
  188. $bitNumber -= $len;
  189.  
  190. //переводим каретку на + $количество_символов вправо
  191. $position += $len;
  192.  
  193. //Склеиваем строку
  194. $text .= $word . " ";
  195. }
  196. return $text;
  197. }
  198.  
  199.  
  200. //Вызовем функцию несколько раз
  201. $amount1 = mt_rand(1,99999999);
  202. $text1 = numberToText($amount1);
  203.  
  204. echo "На вашем счету {$amount1} {$text1}\n";
  205.  
  206. $amount2 = mt_rand(1,99999999);
  207. $text2 = numberToText($amount2);
  208.  
  209. echo "На вашем счету {$amount2} {$text2}\n";
  210.  
  211. $amount3 = mt_rand(1,99999999);
  212. $text3 = numberToText($amount3);
  213.  
  214. echo "На вашем счету {$amount3} {$text3}\n";
  215.  
  216. $amount4 = mt_rand(1,99999999);
  217. $text4 = numberToText($amount4);
  218.  
  219. echo "На вашем счету {$amount4} {$text4}\n";
  220.  
  221. ?>
Success #stdin #stdout 0.02s 52432KB
stdin
Standard input is empty
stdout
На вашем счету 42347512 сорок два миллиона триста сорок семь тысяч пятьсот двенадцать рублей 
На вашем счету 11667776 одиннадцать миллионов шестьсот шестьдесят семь тысяч семьсот семьдесят шесть рублей 
На вашем счету 1571887 один миллионов пятьсот семьдесят одна тысяча восемьсот восемьдесят шесть рублей 
На вашем счету 77253391 семьдесят семь миллионов двести пятьдесят две тысячи триста девяносто один рубль