fork 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 = 0;
  149. echo "$number = ".numberToText($number)."\n";
  150.  
  151. $number = 100100100;
  152. echo "$number = ".numberToText($number)."\n";
  153.  
  154. $number = 1000001;
  155. echo "$number = ".numberToText($number)."\n";
  156.  
  157. $number = 15015015;
  158. echo "$number = ".numberToText($number)."\n";
  159.  
  160. $number = 1000;
  161. echo "$number = ".numberToText($number)."\n";
  162.  
  163. $number = 1;
  164. echo "$number = ".numberToText($number)."\n";
  165.  
  166. $number = 1007099;
  167. echo "$number = ".numberToText($number)."\n";
  168.  
  169.  
  170.  
  171. //$number = 70405080;
  172. //echo "$number = ".numberToText($number)."<br/>";
  173. for ($i = 0; $i< 5; $i++) {
  174. $number = rand(1, 1000000000);
  175. echo "$number = ".numberToText($number)." \n";
  176. }
Success #stdin #stdout 0.02s 24400KB
stdin
Standard input is empty
stdout
0 = рублей 
100100100 = сто миллионов сто тысяч сто рублей 
1000001 = один миллион один рубль 
15015015 = пятнадцать миллионов пятнадцать тысяч пятнадцать рублей 
1000 = одна тысяча рублей 
1 = один рубль 
1007099 = один миллион семь тысяч девяносто девять рублей 
840682707 = восемьсот сорок миллионов шестьсот восемьдесят две тысячи семьсот семь рублей  
933445373 = девятьсот тридцать три миллиона четыреста сорок пять тысяч триста семьдесят три рубля  
671428615 = шестьсот семьдесят один миллион четыреста двадцать восемь тысяч шестьсот пятнадцать рублей  
103063047 = сто три миллиона шестьдесят три тысячи сорок семь рублей  
296405580 = двести девяносто шесть миллионов четыреста пять тысяч пятьсот восемьдесят рублей