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