fork(1) download
  1. <?php
  2.  
  3. // Staring straight up into the sky ... oh my my
  4.  
  5.  
  6. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  7. function inclineWord($number, $word1, $word2, $word3)
  8. {
  9. $number %= 100;
  10. //до 20
  11. if ($number < 20) {
  12. if ($number == 1) {
  13. return $word1;
  14. } elseif (($number < 5) && ($number != 0)) {
  15. return $word2;
  16. } else {
  17. return $word3;
  18. }
  19. } else {
  20. //если больше 20 то только по последней цифре.
  21. $number %= 10;
  22. if ($number == 1) {
  23. return $word1;
  24. } elseif (($number < 5) && ($number != 0)) {
  25. return $word2;
  26. } else {
  27. return $word3;
  28. }
  29. }
  30. }
  31.  
  32. /*
  33.   Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  34.   если мы считаем число для мужского рода (один рубль),
  35.   и 1 — для женского (одна тысяча)
  36. */
  37.  
  38. function smallNumberToText($number, $isFemale)
  39. {
  40.  
  41. $spelling = array(
  42. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  43. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  44. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  45. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  46. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  47. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  48. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  49. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  50. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  51. 9 => 'девять', 19 => 'девятнадцать'
  52. );
  53.  
  54. $femaleSpelling = array(
  55. 1 => 'одна', 2 => 'две'
  56. );
  57.  
  58. if($number == 0) {
  59. return null;
  60. }
  61.  
  62. $strNum = '';
  63. $hundred = floor($number / 100);
  64. $dec = floor(($number % 100) / 10);
  65. $firstNumber = $number % 10;
  66. if ($hundred) {
  67. $key = $hundred * 100;
  68. $strNum .= $spelling[$key] . ' ';
  69. if (($number % 100) == 0) {
  70. return $strNum;
  71. }
  72. }
  73.  
  74. if ($dec) {
  75. if ($dec == 1) {
  76. $key = $number % 100;
  77. $strNum .= $spelling[$key] . ' ';
  78. } else {
  79. $key = $dec * 10;
  80. $strNum .= $spelling[$key] . ' ';
  81. }
  82. if (!$firstNumber) {
  83. return $strNum;
  84. }
  85. }
  86.  
  87. if ($dec != 1) {
  88. if ((($firstNumber == 1) or ($firstNumber == 2)) and ($isFemale == 1)) {
  89. $strNum .= $femaleSpelling[$firstNumber] . ' ';
  90. } else {
  91. $strNum .= $spelling[$firstNumber];
  92. }
  93. }
  94. return $strNum;
  95. }
  96.  
  97. function numberToText($number)
  98. {
  99. if ($number == 0) {
  100. return '0 рублей';
  101. }
  102. $number = number_format($number);
  103. $millions = '';
  104. $thousand = '';
  105. $hundred = '';
  106. $numbers = preg_split('/,/', $number, 0, PREG_SPLIT_NO_EMPTY);
  107. //Миллионы
  108. if (count($numbers) > 2) {
  109. $triad = array_shift($numbers);
  110. $millions = smallNumberToText($triad, 0);
  111. $millions .= ' ' . inclineWord($triad, 'миллион', 'миллиона', 'миллионов');
  112. }
  113. //тысячи
  114. if (count($numbers) > 1) {
  115. $triad = array_shift($numbers);
  116. $lastNum = preg_split('//', $triad);
  117. $lastNum = end($lastNum);
  118. if ($lastNum < 2) {
  119. $thousand = smallNumberToText($triad, 1);
  120. } else {
  121. $thousand = smallNumberToText($triad, 0);
  122. }
  123. $thousand .= ' ' . inclineWord($triad, 'тысяча', 'тысячи', 'тысяч');
  124. }
  125. //Меньше тысячи
  126. if (count($numbers) > 0) {
  127. $triad = array_shift($numbers);
  128. $hundred = smallNumberToText($triad, 0);
  129. $hundred .= ' (' . $number . ') ';
  130. $hundred .= ' ' . inclineWord($triad, 'рубль', 'рубля', 'рублей');
  131. }
  132. //склеиваем и возвращаем
  133. $number = trim($millions . ' ' . $thousand . ' ' . $hundred);
  134. $number = preg_replace('/ +/', ' ', $number);
  135. return $number;
  136. }
  137.  
  138. /* Вызовем функцию несколько раз */
  139. $amount1 = mt_rand(1,99999999);
  140. $text1 = numberToText($amount1);
  141.  
  142. echo "На вашем счету {$text1}\n";
  143.  
  144. $amount2 = mt_rand(1,99999999);
  145. $text2 = numberToText($amount2);
  146.  
  147. echo "На вашем счету {$text2}\n";
  148.  
  149. $amount3 = mt_rand(1,99999999);
  150. $text3 = numberToText($amount3);
  151.  
  152. echo "На вашем счету {$text3}\n";
  153.  
  154. $amount4 = mt_rand(1,99999999);
  155. $text4 = numberToText($amount4);
  156.  
  157. echo "На вашем счету {$text4}\n";
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
На вашем счету сорок пять миллионов сто тридцать девять тысяч триста шестьдесят шесть (45,139,366) рублей
На вашем счету тридцать два миллиона шестьсот тридцать две тысячи сто восемьдесят пять (32,632,185) рублей
На вашем счету тридцать два миллиона пятьсот семьдесят четыре тысячи семьсот шестьдесят семь (32,574,767) рублей
На вашем счету сорок один миллион сто восемьдесят две тысячи сорок четыре (41,182,044) рубля