fork(2) 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, $word5)
  8. {
  9.  
  10. $lastTwoDigits = $number % 100;
  11. $lastDigit = $lastTwoDigits % 10;
  12.  
  13. if (($word1 != "рубль") && $number == 0) {
  14. return "";
  15. }
  16. if ($lastTwoDigits >= 10 && $lastTwoDigits <= 20) {
  17. return $word5;
  18. } elseif ($lastDigit == 1) {
  19. return $word1;
  20. } elseif ($lastDigit > 1 && $lastDigit < 5) {
  21. return $word2;
  22. } else {
  23. return $word5;
  24. }
  25. }
  26.  
  27. /*
  28. Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  29. если мы считаем число для мужского рода (один рубль),
  30. и 1 — для женского (одна тысяча)
  31. */
  32. function smallNumberToText($number, $isFemale = 0, $isNotFirstRank = 0)
  33. {
  34.  
  35. $spelling = array(
  36. 0 => 'ноль',
  37. 10 => 'десять',
  38. 100 => 'сто',
  39. 1 => 'один',
  40. 11 => 'одиннадцать',
  41. 20 => 'двадцать',
  42. 200 => 'двести',
  43. 2 => 'два',
  44. 12 => 'двенадцать',
  45. 30 => 'тридцать',
  46. 300 => 'триста',
  47. 3 => 'три',
  48. 13 => 'тринадцать',
  49. 40 => 'сорок',
  50. 400 => 'четыреста',
  51. 4 => 'четыре',
  52. 14 => 'четырнадцать',
  53. 50 => 'пятьдесят',
  54. 500 => 'пятьсот',
  55. 5 => 'пять',
  56. 15 => 'пятнадцать',
  57. 60 => 'шестьдесят',
  58. 600 => 'шестьсот',
  59. 6 => 'шесть',
  60. 16 => 'шестнадцать',
  61. 70 => 'семьдесят',
  62. 700 => 'семьсот',
  63. 7 => 'семь',
  64. 17 => 'семнадцать',
  65. 80 => 'восемьдесят',
  66. 800 => 'восемьсот',
  67. 8 => 'восемь',
  68. 18 => 'восемнадцать',
  69. 90 => 'девяносто',
  70. 900 => 'девятьсот',
  71. 9 => 'девять',
  72. 19 => 'девятнадцать'
  73. );
  74.  
  75. $femaleSpelling = array(
  76. 1 => 'одна',
  77. 2 => 'две'
  78. );
  79.  
  80. $notFirstRank = array(
  81. 0 => ''
  82. );
  83.  
  84. if ($isNotFirstRank) {
  85. $spelling = array_replace($spelling, $notFirstRank);
  86. }
  87.  
  88. if ($isFemale) {
  89. $spelling = array_replace($spelling, $femaleSpelling);
  90. }
  91.  
  92. if ($number <= 20) {
  93. return $spelling[$number];
  94. } elseif ($number < 100) {
  95. $decade = floor($number / 10) * 10;
  96. $year = $number % 10;
  97. return ($year) ? $spelling[$decade] . " " . $spelling[$year] : $spelling[$decade];
  98. } elseif ($number < 1000) {
  99. $century = floor($number / 100) * 100;
  100. $mod = $number % 100;
  101.  
  102. return ($mod) ? $spelling[$century] . " " . smallNumberToText($mod, $isFemale) : $spelling[$century];
  103. }
  104. }
  105.  
  106. function numberToText($number)
  107. {
  108. $result = "";
  109.  
  110. settype($number, "string");
  111. $length = mb_strlen($number);
  112.  
  113. if ($length < 4) {
  114. $words = 1;
  115. } elseif ($length > 3 && $length < 7) {
  116. $words = 2;
  117. } elseif ($length > 6 && $length < 10) {
  118. $words = 3;
  119. } elseif ($length > 9 && $length < 13) {
  120. $words = 4;
  121. }
  122.  
  123. $money = array(
  124. 1 => array(
  125. "word1" => "рубль",
  126. "word2" => "рубля",
  127. "word5" => "рублей",
  128. "isFemale" => 0
  129. ),
  130. 2 => array(
  131. "word1" => "тысяча",
  132. "word2" => "тысячи",
  133. "word5" => "тысяч",
  134. "isFemale" => 1
  135. ),
  136. 3 => array(
  137. "word1" => "миллион",
  138. "word2" => "миллиона",
  139. "word5" => "миллионов",
  140. "isFemale" => 0
  141. ),
  142. 4 => array(
  143. "word1" => "миллиард",
  144. "word2" => "миллиарда",
  145. "word5" => "миллиардов",
  146. "isFemale" => 0
  147. )
  148. );
  149.  
  150. $firstDigit = 0;
  151.  
  152. for ($i = $words; $i > 0; $i--) {
  153. $qty = (($firstDigit == 0) && ($length % 3 != 0)) ? $length % 3 : 3;
  154. $result .= " " . smallNumberToText((integer) mb_substr($number, $firstDigit, $qty), $money[$i]["isFemale"], $firstDigit);
  155. if ($firstDigit == 0) {
  156. $result = ltrim($result);
  157. }
  158. $result .= " " . inclineWord((integer) mb_substr($number, $firstDigit, $qty), $money[$i]["word1"], $money[$i]["word2"], $money[$i]["word5"]);
  159. $firstDigit += $qty;
  160. }
  161. $reg = "/([\\w])(\\s+)([\\w])/ui";
  162.  
  163. $right = "$1 $3";
  164.  
  165. $spacesFixed = preg_replace($reg, $right, $result);
  166.  
  167. return $spacesFixed;
  168. }
  169.  
  170. /* Вызовем функцию несколько раз */
  171.  
  172. $number1 = 3001079;
  173. $spelled = numberToText($number1);
  174. echo "На вашем счету $spelled. \n";
  175.  
  176. $number2 = 1000001;
  177. $spelled2 = numberToText($number2);
  178. echo "На вашем счету $spelled2. \n";
  179.  
  180. $number = 123456;
  181. $text0 = numberToText($number);
  182. echo "На вашем счету $text0.\n";
  183.  
  184. $amount1 = mt_rand(1, 9999999999);
  185. $text1 = numberToText($amount1);
  186.  
  187. echo "На вашем счету {$text1}.\n";
  188.  
  189. $amount2 = mt_rand(1, 9999999999);
  190. $text2 = numberToText($amount2);
  191.  
  192. echo "На вашем счету {$text2}.\n";
  193.  
  194. $amount3 = mt_rand(1, 9999999999);
  195. $text3 = numberToText($amount3);
  196.  
  197. echo "На вашем счету {$text3}.\n";
  198.  
  199. $amount4 = mt_rand(1, 9999999999);
  200. $text4 = numberToText($amount4);
  201.  
  202. echo "На вашем счету {$text4}.\n";
  203.  
  204.  
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
    На вашем счету три миллиона одна тысяча семьдесят девять рублей. 
На вашем счету один миллион один рубль. 
На вашем счету сто двадцать три тысячи четыреста пятьдесят шесть рублей.
На вашем счету двадцать восемь миллионов сто восемьдесят три тысячи девятьсот рублей.
На вашем счету двести сорок один миллион восемьсот сорок восемь тысяч двадцать восемь рублей.
На вашем счету один миллиард триста восемьдесят пять миллионов восемьсот восемь тысяч сто восемьдесят девять рублей.
На вашем счету один миллиард сто сорок пять миллионов восемьсот девяносто восемь тысяч сто сорок один рубль.