fork 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. {
  7. $last2Digits = $number % 100;
  8. if ($last2Digits > 19) { $last2Digits = $last2Digits % 10; }
  9. switch ($last2Digits) {
  10. case 1: { return " {$word1}"; }
  11. case 2: case 3: case 4: { return " {$word2}"; }
  12. default: { return " {$word5}"; }
  13. }
  14. }
  15.  
  16. /*
  17. Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  18. если мы считаем число для мужского рода (один рубль),
  19. и 1 — для женского (одна тысяча)
  20. */
  21. function smallNumberToText($number, $isFemale)
  22. {
  23.  
  24. $spelling = array(
  25. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  26. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  27. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  28. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  29. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  30. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  31. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  32. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  33. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  34. 9 => 'девять', 19 => 'девятнадцать'
  35. );
  36.  
  37. $femaleSpelling = array(
  38. 1 => 'одна',
  39. 2 => 'две'
  40. );
  41.  
  42. $str = array();
  43.  
  44. if($number == 0){
  45. return null;
  46. }
  47.  
  48. if($isFemale == 1){
  49. if(array_key_exists($number, $femaleSpelling)){
  50. return $femaleSpelling[$number];
  51. }
  52. }
  53. else{
  54. if (array_key_exists($number, $spelling)) {
  55. return $spelling[$number];
  56. }
  57. }
  58.  
  59. $last2Digits = $number % 100;
  60.  
  61. $hundreds = floor($number / 100) * 100;
  62. $tens = floor($number % 100 / 10) * 10;
  63. $units = $number % 10;
  64.  
  65. if ($hundreds > 0) {
  66. array_push($str, $spelling[$hundreds]);
  67. }
  68. if($last2Digits >= 11 && $last2Digits <= 19){
  69. array_push($str, $spelling[$last2Digits]);
  70. }
  71. else{
  72. if ($tens > 0) {
  73. array_push($str, $spelling[$tens]);
  74. }
  75. if ($units > 0) {
  76. if($isFemale == 1){
  77. array_push($str, $femaleSpelling[$units]);
  78. }
  79. else{
  80. array_push($str, $spelling[$units]);
  81. }
  82. }
  83. }
  84. $str = implode($str, " ");
  85. return trim($str);
  86. }
  87.  
  88. function numberToText($number)
  89. {
  90.  
  91. if($number == 0){
  92. $str = "ноль рублей";
  93. return $str;
  94. }
  95.  
  96. $hundredsDigits = $number % 1000;
  97. $thousandsDigits = (floor($number / 1000)) % 1000;
  98.  
  99. $checkFemale = $thousandsDigits % 10;
  100.  
  101. if($checkFemale == 1 || $checkFemale == 2 || $thousandsDigits == 1 || $thousandsDigits == 2){
  102. $thousandsWords = smallNumberToText($thousandsDigits, 1);
  103. }
  104. else{
  105. $thousandsWords = smallNumberToText($thousandsDigits, 0);
  106. }
  107.  
  108. $millionsDigits = ((floor($number / 1000)) / 1000) % 1000;
  109.  
  110. $hundredsWords = smallNumberToText($hundredsDigits, 0);
  111.  
  112. $millionsWords = smallNumberToText($millionsDigits, 0);
  113.  
  114. if($millionsDigits > 0){
  115. $millionsWords .= inclineWord($millionsDigits, "миллион", "миллиона", "миллионов");
  116. }
  117. if($thousandsDigits > 0){
  118. $thousandsWords .= inclineWord($thousandsDigits, "тысяча", "тысячи", "тысяч");
  119. }
  120.  
  121. $words = array($millionsWords, $thousandsWords, $hundredsWords);
  122. $words = array_filter($words);
  123.  
  124. $str = implode($words, " ");
  125. $str .= inclineWord($number, "рубль", "рубля", "рублей");
  126. return trim($str);
  127. }
  128.  
  129. /* Вызовем функцию несколько раз */
  130. $amount1 = 901999999;
  131. $text1 = numberToText($amount1);
  132.  
  133. echo "На вашем счету {$text1}\n";
  134.  
  135. $amount2 = 0;
  136. $text2 = numberToText($amount2);
  137.  
  138. echo "На вашем счету {$text2}\n";
  139.  
  140. $amount3 = 1;
  141. $text3 = numberToText($amount3);
  142.  
  143. echo "На вашем счету {$text3}\n";
  144.  
  145. $amount4 = 11012013;
  146. $text4 = numberToText($amount4);
  147.  
  148. echo "На вашем счету {$text4}\n";
  149.  
  150. $amount5 = 7000008;
  151. $text5 = numberToText($amount5);
  152.  
  153. echo "На вашем счету {$text5}\n";
  154.  
  155. $amount6 = 1000;
  156. $text6 = numberToText($amount6);
  157.  
  158. echo "На вашем счету {$text6}\n";
  159.  
  160. $amount7 = 71000;
  161. $text7 = numberToText($amount7);
  162.  
  163. echo "На вашем счету {$text7}\n";
  164.  
  165. $amount8 = 101000;
  166. $text8 = numberToText($amount8);
  167.  
  168. echo "На вашем счету {$text8}\n";
  169.  
  170. $amount9 = 82000;
  171. $text9 = numberToText($amount9);
  172.  
  173. echo "На вашем счету {$text9}\n";
Success #stdin #stdout 0.02s 24604KB
stdin
Standard input is empty
stdout
На вашем счету девятьсот один миллион девятьсот девяносто девять тысяч девятьсот девяносто девять рублей
На вашем счету ноль рублей
На вашем счету один рубль
На вашем счету одиннадцать миллионов двенадцать тысяч тринадцать рублей
На вашем счету семь миллионов восемь рублей
На вашем счету одна тысяча рублей
На вашем счету семьдесят одна тысяча рублей
На вашем счету сто одна тысяча рублей
На вашем счету восемьдесят две тысячи рублей