fork download
  1. <?php
  2. header("Content-Type: text/plain");
  3.  
  4. // Числа прописью
  5.  
  6. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  7. function inclineWord($number, $word1, $word2, $word5) {
  8.  
  9. $word = ""; //правильная форма склонения
  10. $lastNum = $number % 10; //последняя цифра числа
  11.  
  12. if (4 < $number % 100 && $number % 100 <= 19) {
  13. $word = $word5;
  14. } elseif ($lastNum == 1) {
  15. $word = $word1;
  16. } elseif ($lastNum >= 2 && $lastNum <= 4) {
  17. $word = $word2;
  18. } elseif ($lastNum >= 5 || $lastNum == 0) {
  19. $word = $word5;
  20. }
  21. return $word;
  22. }
  23.  
  24. /*
  25.   Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  26.   если мы считаем число для мужского рода (один рубль),
  27.   и 1 — для женского (одна тысяча)
  28. */
  29. function smallNumberToText($number, $isFemale) {
  30.  
  31. $spelling = array(
  32. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  33. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  34. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  35. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  36. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  37. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  38. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  39. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  40. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  41. 9 => 'девять', 19 => 'девятнадцать'
  42. );
  43.  
  44. $femaleSpelling = array(
  45. 1 => 'одна', 2 => 'две'
  46. );
  47.  
  48. $numbers=array(); // числа прописью для каждого разряда
  49. $text = ''; // числа прописью строкой
  50. $lastNum = $number % 10; // последняя цифра числа
  51. $lastTwoNum = $number % 100; // последние две цифры числа
  52.  
  53.  
  54. // если в числе есть сотни, добавляем слово для сотен
  55. if ($number>=100) {
  56. $numbers[] = $spelling[(floor($number/100))*100];
  57. }
  58. if (11 <= $lastTwoNum && $lastTwoNum <= 19) { //... слово для 11-19
  59. $numbers[] = $spelling[$lastTwoNum];
  60. /*
  61.   * если число между 11 и 19, то дальше переименовывать не нужно
  62.   * нижние две строчки копипастятся, это плохо? Второй вариант, это добавить
  63.   * else к условию, и вложить все нижеидущие условия.
  64.   */
  65. $text = implode (" ", $numbers); //склеиваем строку из массива
  66. return $text;
  67. }
  68. if (10 <= $lastTwoNum && $lastTwoNum <= 99) { //... слово десятков
  69. $numbers[] = $spelling[floor(($lastTwoNum)/10)*10];
  70. }
  71. if (1 <= $lastNum && $lastNum <= 9) { //... слово единиц
  72.  
  73. if (($lastNum == 1 || $lastNum == 2) && $isFemale==1) { //... женский род
  74. $numbers[] = $femaleSpelling[$lastNum];
  75.  
  76. } else {
  77. $numbers[] = $spelling[$lastNum];
  78. }
  79. }
  80. if ($number==0) { //... слово для нуля
  81. $numbers[] = $spelling[$number];
  82. }
  83.  
  84. //склеиваем строку из слов
  85. $text = implode (" ", $numbers);
  86. return $text;
  87. }
  88.  
  89.  
  90. function numberToText($number) {
  91.  
  92. $i = 0; // счетчик, сумма переименованных частей числа
  93. $result = ""; // число прописью одной строкой
  94. $strs = array(); // разряды числа прописью
  95. $bit = 0; // текущий разряд
  96. $words = array(
  97. array("рубль", "рубля", "рублей"),
  98. array("тысяча", "тысячи", "тысяч"),
  99. array("миллион", "миллиона", "миллионов")
  100. /* просто добавь разряд */
  101. );
  102.  
  103. if ($number == 0) { // если число 0, то возвращаем результат
  104. return "ноль (0) рублей";
  105. //return smallNumberToText($number, $bit) . " ($number) " . inclineWord($number, $words[$bit][0], $words[$bit][1], $words[$bit][2]);
  106. }
  107.  
  108. // если число > 0
  109. // продолжаем пока сумма всех переименованных частей числа < исходное число
  110. while ($i < $number) {
  111.  
  112. // берем по очереди часть числа (3 разряда начиная справа)
  113. $pieceNumber = floor(intval($number/(pow(1000, $bit)))) % 1000;
  114.  
  115. // если в разряде единиц-десятков-сотен все нули
  116. if ($pieceNumber == 0 && $bit == 0) {
  117.  
  118. // склоняем слово "рубль"
  119. $strs[] = "($number) " . inclineWord($number, $words[$bit][0], $words[$bit][1], $words[$bit][2]);
  120. }
  121.  
  122. // если в разряде не только нули
  123. if ($pieceNumber > 0) {
  124.  
  125. // склоняем название разряда
  126. $word = inclineWord($pieceNumber, $words[$bit][0], $words[$bit][1], $words[$bit][2]);
  127.  
  128. // добавляем число цифрами перед "рублей"
  129. if ($bit == 0) {
  130. $num = " ($number) ";
  131. } else {
  132. $num = " ";
  133. }
  134.  
  135. // отправляем число на переименование и добавляем название разряда
  136. $strs[] = smallNumberToText($pieceNumber, $bit) . $num . $word;
  137. }
  138.  
  139. // суммируем переименованные части числа (счетчик)
  140. $i += $pieceNumber*(pow(1000, $bit));
  141.  
  142. // увеличиваем текущий разряд
  143. $bit++;
  144. }
  145.  
  146. // склеиваем результат в одну строку
  147. $result = implode (" ", array_reverse($strs));
  148. return $result;
  149. }
  150.  
  151. // Вызовем функцию несколько раз
  152. $amount1 = 0;
  153. $text1 = numberToText($amount1);
  154.  
  155. echo "На вашем счету {$text1}\n";
  156.  
  157. $amount2 = mt_rand(1,99999999);
  158. $text2 = numberToText($amount2);
  159.  
  160. echo "На вашем счету {$text2}\n";
  161.  
  162. $amount3 = mt_rand(1,99999999);
  163. $text3 = numberToText($amount3);
  164.  
  165. echo "На вашем счету {$text3}\n";
  166.  
  167. $amount4 = mt_rand(1,99999999);
  168. $text4 = numberToText($amount4);
  169.  
  170. echo "На вашем счету {$text4}\n";
  171.  
  172. ?>
Success #stdin #stdout 0.02s 52472KB
stdin
Standard input is empty
stdout
На вашем счету ноль (0) рублей
На вашем счету тридцать восемь миллионов четыреста шестьдесят шесть тысяч девятьсот двадцать два (38466922) рубля
На вашем счету пять миллионов восемьсот семьдесят тысяч семьсот девяносто четыре (5870794) рубля
На вашем счету девятнадцать миллионов восемьсот сорок две тысячи триста семьдесят девять (19842379) рублей