fork download
  1. <?php
  2.  
  3. /**
  4.  * 05.05.2015 (20:17)
  5.  * TheNumbers.php
  6.  * PhpStorm
  7.  */
  8.  
  9. header("Content-Type: text/plain; charset=utf-8");
  10.  
  11. /* Делает первую букву предложения заглавной */
  12. function makeFirstLetterUppercase($input)
  13. {
  14. $firstLetter = mb_substr($input, 0, 1);
  15. $firstLetter = mb_strtoupper($firstLetter);
  16. $otherLetters = mb_substr($input, 1);
  17. $result = $firstLetter . $otherLetters;
  18. return $result;
  19. }
  20.  
  21. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  22. function inclineWord($input, $word1, $word2, $word5)
  23. {
  24. if (($input >= 11) && ($input <= 14)) {
  25. $result = $word5;
  26. } else {
  27. $lastSymbol = $input % 10;
  28. if ($lastSymbol == 1) {
  29. $result = $word1;
  30. } elseif (($lastSymbol >= 2) && ($lastSymbol <= 4)) {
  31. $result = $word2;
  32. } else {
  33. $result = $word5;
  34. }
  35. }
  36. return $result;
  37. }
  38.  
  39. /**
  40.  * Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  41.  * если мы считаем число для мужского рода (один рубль),
  42.  * и 1 — для женского (одна тысяча)
  43.  */
  44. function smallNumberToText($input, $isFemale)
  45. {
  46. $spelling = array(
  47. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  48. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  49. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  50. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  51. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  52. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  53. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  54. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  55. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  56. 9 => 'девять', 19 => 'девятнадцать'
  57. );
  58.  
  59. $femaleSpelling = array(
  60. 1 => 'одна', 2 => 'две',
  61. );
  62.  
  63. $text = array();
  64.  
  65. if ($isFemale == 1) {
  66. $spelling = array_replace($spelling, $femaleSpelling);
  67. }
  68.  
  69. $singleDigits = $input % 10;
  70. $tens = $input % 100;
  71. $tensSave = $tens - $singleDigits;
  72. $hundreds = $input - $tens;
  73.  
  74. if ($input == 0) {
  75. $text[] = $spelling[$input];
  76. }
  77. if ($hundreds != 0) {
  78. $text[] = $spelling[$hundreds];
  79. }
  80. if (($tens >= 1) && ($tens <= 19)) {
  81. $text[] = $spelling[$tens];
  82. }
  83. if (($tens >= 20) && ($tens <= 99)) {
  84. $text[] = $spelling[$tensSave];
  85. if ($singleDigits != 0) {
  86. $text[] = $spelling[$singleDigits];
  87. }
  88. }
  89.  
  90. $result = implode(" ", $text);
  91.  
  92. return $result;
  93. }
  94.  
  95. function numberToText($input)
  96. {
  97. $text = array();
  98.  
  99. $million = floor($input / 1000000);
  100. $thousand = floor(($input - ($million * 1000000)) / 1000);
  101. $hundreds = $input % 1000;
  102.  
  103. if ($million != 0) {
  104. $text[] = smallNumberToText($million, 0);
  105. $text[] = inclineWord($million, 'миллион', 'миллиона', 'миллионов');
  106. }
  107. if ($thousand != 0) {
  108. $text[] = smallNumberToText($thousand, 1);
  109. $text[] = inclineWord($thousand, 'тысяча', 'тысячи', 'тысяч');
  110. }
  111. if ($hundreds != 0) {
  112. $text[] = smallNumberToText($hundreds, 0);
  113. $text[] = inclineWord($hundreds, 'рубль.', 'рубля.', 'рублей.');
  114. }
  115.  
  116. $result = implode(" ", $text);
  117. $result = makeFirstLetterUppercase($result);
  118.  
  119. return $result;
  120. }
  121.  
  122. $amount = mt_rand(0, 999);
  123. $text = numberToText($amount);
  124. echo "На вашем счету: {$text} ({$amount})\n";
  125.  
  126. $amount = mt_rand(1000, 9999);
  127. $text = numberToText($amount);
  128. echo "На вашем счету: {$text} ({$amount})\n";
  129.  
  130. $amount = mt_rand(10000, 99999);
  131. $text = numberToText($amount);
  132. echo "На вашем счету: {$text} ({$amount})\n";
  133.  
  134. $amount = mt_rand(100000, 999999);
  135. $text = numberToText($amount);
  136. echo "На вашем счету: {$text} ({$amount})\n";
  137.  
  138. $amount = mt_rand(1000000, 9999999);
  139. $text = numberToText($amount);
  140. echo "На вашем счету: {$text} ({$amount})\n";
  141.  
  142. $amount = mt_rand(10000000, 99999999);
  143. $text = numberToText($amount);
  144. echo "На вашем счету: {$text} ({$amount})\n";
  145.  
  146. $amount = 11011011;
  147. $text = numberToText($amount);
  148. echo "На вашем счету: {$text} ({$amount})\n";
  149.  
  150. $amount = 11012013;
  151. $text = numberToText($amount);
  152. echo "На вашем счету: {$text} ({$amount})\n";
  153.  
  154. $amount = 0;
  155. $text = numberToText($amount);
  156. echo "На вашем счету: {$text} ({$amount})\n";
  157.  
  158. $amount = 1;
  159. $text = numberToText($amount);
  160. echo "На вашем счету: {$text} ({$amount})\n";
  161.  
  162. $amount = 9000001;
  163. $text = numberToText($amount);
  164. echo "На вашем счету: {$text} ({$amount})\n";
Success #stdin #stdout 0.02s 24400KB
stdin
Standard input is empty
stdout
На вашем счету: Шестьдесят три рубля. (63)
На вашем счету: Шесть тысяч восемьдесят пять рублей. (6085)
На вашем счету: Пятьдесят тысяч триста девяносто восемь рублей. (50398)
На вашем счету: Четыреста тридцать две тысячи шестьсот двадцать девять рублей. (432629)
На вашем счету: Шесть миллионов четыреста двадцать одна тысяча девятьсот тринадцать рубля. (6421913)
На вашем счету: Четырнадцать миллионов четыреста сорок шесть тысяч девятьсот шестьдесят восемь рублей. (14446968)
На вашем счету: Одиннадцать миллионов одиннадцать тысяч одиннадцать рублей. (11011011)
На вашем счету: Одиннадцать миллионов двенадцать тысяч тринадцать рублей. (11012013)
На вашем счету:  (0)
На вашем счету: Один рубль. (1)
На вашем счету: Девять миллионов один рубль. (9000001)