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