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