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