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