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