fork(3) download
  1. <?php
  2.  
  3. // Staring straight up into the sky ... oh my my
  4.  
  5. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  6. function addStupidWord($number, $numberString, $spelling) {
  7. $lastDigit = $number % 10;
  8. $number = $number % 100;
  9. if ($number < 5 ) {
  10. $numberString .= $spelling[$lastDigit];
  11. } elseif($number >= 5 && $number <= 20) {
  12. $numberString .= $spelling[0];
  13. } else {
  14. $numberString .= $spelling[$lastDigit];
  15. }
  16. return $numberString.' ';
  17. }
  18.  
  19. // Разбираемся с родом числительного
  20. function dealWithGender($smallNumberString, $lastDigit, $maleSpelling ,$isFemale) {
  21. $femaleSpelling = array(
  22. 1 => 'одна', 2 => 'две'
  23. );
  24. if (($lastDigit == 1 || $lastDigit == 2) && $isFemale) {
  25. $smallNumberString .= $femaleSpelling[$lastDigit] . ' ';
  26. } else {
  27. $smallNumberString .= $maleSpelling . ' ';
  28. }
  29.  
  30. return $smallNumberString;
  31. }
  32. /*
  33.   Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен false,
  34.   если мы считаем число для мужского рода (один рубль),
  35.   и 1 — для женского (одна тысяча)
  36. */
  37. function smallNumberToText($number, $isFemale) {
  38.  
  39. $spelling = array(
  40. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  41. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  42. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  43. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  44. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  45. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  46. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  47. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  48. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  49. 9 => 'девять', 19 => 'девятнадцать'
  50. );
  51. $smallNumberString = '';
  52. // last 2 digits
  53. if ($number >= 100) {
  54. $smallNumberString .= $spelling[$number - $number % 100].' ';
  55. $number = $number % 100;
  56. }
  57. //echo "$number<br/>";
  58. //echo "$smallNumberString<br/>";
  59. if ($number > 0) {
  60. $lastDigit = $number % 10;
  61. if ($number < 20) { // 0..19
  62. $smallNumberString = dealWithGender($smallNumberString,
  63. $number,
  64. $spelling[$number],
  65. $isFemale);
  66.  
  67. } elseif ($number < 100) { // 20..99
  68.  
  69. $smallNumberString .= $spelling[($number - $lastDigit)] . ' ';
  70. if ($lastDigit > 0) {
  71. $smallNumberString = dealWithGender($smallNumberString,
  72. $lastDigit,
  73. $spelling[$lastDigit],
  74. $isFemale);
  75. //echo "$smallNumberString<br/>";
  76. }
  77. }
  78. }
  79. return $smallNumberString;
  80. }
  81.  
  82. function numberToText($number) {
  83. $spellingRubles = array(
  84. 0 => 'рублей', 6 => 'рублей',
  85. 1 => 'рубль', 7 => 'рублей',
  86. 2 => 'рубля', 8 => 'рублей',
  87. 3 => 'рубля', 9 => 'рублей',
  88. 4 => 'рубля', 10 => 'рублей',
  89. 5 => 'рублей'
  90. );
  91. $spellingThousand = array (
  92. 0 => 'тысяч', 6 => 'тысяч',
  93. 1 => 'тысяча', 7 => 'тысяч',
  94. 2 => 'тысячи', 8 => 'тысяч',
  95. 3 => 'тысячи', 9 => 'тысяч',
  96. 4 => 'тысячи', 10 => 'тысяч',
  97. 5 => 'тысяч'
  98. );
  99. $spellingMillion = array (
  100. 0 => 'миллионов', 6 => 'миллионов',
  101. 1 => 'миллион', 7 => 'миллионов',
  102. 2 => 'миллиона', 8 => 'миллионов',
  103. 3 => 'миллиона', 9 => 'миллионов',
  104. 4 => 'миллиона', 10 => 'миллионов',
  105. 5 => 'миллионов'
  106. );
  107. $spellingBillion = array (
  108. 0 => 'миллиардов', 6 => 'миллиардов',
  109. 1 => 'миллиард', 7 => 'миллиардов',
  110. 2 => 'миллиарда', 8 => 'миллиардов',
  111. 3 => 'миллиарда', 9 => 'миллиардов',
  112. 4 => 'миллиарда', 10 => 'миллиардов',
  113. 5 => 'миллиардов'
  114. );
  115.  
  116. $numberString = "";
  117. if($number > 999999) {
  118. $smallNumber = floor($number / 1000000);
  119. //echo "миллионы = $smallNumber <br/>";
  120. $numberString .= smallNumberToText($smallNumber, false);
  121. $numberString = addStupidWord($smallNumber, $numberString, $spellingMillion);
  122. $number -= $smallNumber * 1000000;
  123. //echo " чилсо меньше 1000000 = $number <br/>";
  124. }
  125.  
  126. if($number > 999) {
  127. $smallNumber = floor($number / 1000);
  128. //echo "тысячи = $smallNumber <br/>";
  129. $numberString .= smallNumberToText($smallNumber, true);
  130. $numberString = addStupidWord($smallNumber, $numberString, $spellingThousand);
  131. $number -= $smallNumber * 1000;
  132. //echo " чилсо меньше 1000 = $number <br/>";
  133. }
  134.  
  135. if($number >= 0) {
  136. $smallNumber = floor($number / 1);
  137. //echo "рубли = $smallNumber <br/>";
  138. $numberString .= smallNumberToText($smallNumber, false);
  139. $numberString = addStupidWord($smallNumber, $numberString, $spellingRubles);
  140. }
  141.  
  142. return $numberString;
  143.  
  144. }
  145.  
  146.  
  147.  
  148. //$number = 70405080;
  149. //echo "$number = ".numberToText($number)."<br/>";
  150. for ($i = 0; $i< 5; $i++) {
  151. $number = rand(1, 1000000000);
  152. echo "$number = ".numberToText($number)." \n";
  153. }
Success #stdin #stdout 0.02s 24448KB
stdin
Standard input is empty
stdout
781423344 = семьсот восемьдесят один миллион четыреста двадцать три тысячи триста сорок четыре рубля  
238540297 = двести тридцать восемь миллионов пятьсот сорок тысяч двести девяносто семь рублей  
494627448 = четыреста девяносто четыре миллиона шестьсот двадцать семь тысяч четыреста сорок восемь рублей  
334276299 = триста тридцать четыре миллиона двести семьдесят шесть тысяч двести девяносто девять рублей  
885962489 = восемьсот восемьдесят пять миллионов девятьсот шестьдесят две тысячи четыреста восемьдесят девять рублей