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