fork download
  1. <?php
  2.  
  3.  
  4. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  5. function inclineWord($number, $wordsArray) {
  6. $word1 = $wordsArray[1];
  7. $word2 = $wordsArray[2];
  8. $word5 = $wordsArray[5];
  9. $last = $number%10;
  10. $lastTwo = $number%100;
  11. if ($lastTwo > 10 and $lastTwo <20 || $last == 0 || $last > 4) {
  12. return $word5;
  13. } elseif ($last > 1 and $last < 5) {
  14. return $word2;
  15. } elseif ($last == 1) {
  16. return $word1;
  17. }
  18. }
  19.  
  20. /*
  21.   Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  22.   если мы считаем число для мужского рода (один рубль),
  23.   и 1 — для женского (одна тысяча)
  24. */
  25. function smallNumberToText($number, $isFemale) {
  26.  
  27. $spelling = array(
  28. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  29. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  30. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  31. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  32. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  33. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  34. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  35. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  36. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  37. 9 => 'девять', 19 => 'девятнадцать'
  38. );
  39.  
  40. $femaleSpelling = array(
  41. 1 => 'одна', 2 => 'две'
  42. );
  43.  
  44. if ($isFemale == 1) {
  45. $spelling[1] = $femaleSpelling[1];
  46. $spelling[2] = $femaleSpelling[2];
  47. }
  48.  
  49. $numberArray = array();
  50.  
  51. $tens = 0;
  52. $one = $number % 1000;
  53. $two = $number % 100;
  54. $three = $number % 10;
  55. $numberCount = 0;
  56. if ($two >10 and $two <20) {
  57. $tens = 1;
  58. }
  59. $oneNew = $one - $two;
  60. $twoNew = $two - $three;
  61. if ($number >= 100) {
  62. $numberCount = 2;
  63. $numberArray[0] = $spelling[$oneNew];
  64. if ($twoNew != 0) {
  65. $numberArray[1] = $spelling[$twoNew];
  66. }
  67. $numberArray[2] = $spelling[$three];
  68. } elseif ($number <100 and $number >= 10) {
  69. $numberCount = 1;
  70. $numberArray[0] = $spelling[$twoNew];
  71. $numberArray[1] = $spelling[$three];
  72. } elseif ($number <10) {
  73. $numberArray[0] = $spelling[$three];
  74. }
  75. if ($tens == 1 || $three == 0) {
  76. unset($numberArray[$numberCount]);
  77. $numberArray[$numberCount - 1] = $spelling[$two];
  78. }
  79. $result = implode(' ', $numberArray);
  80. return $result;
  81. }
  82.  
  83. function numberToText($number) {
  84. $isFemale = 0;
  85. $rubles = array(1 => 'рубль', 2 => 'рубля', 5 => 'рублей');
  86. $bigNumbers = array(
  87. 2 => array(
  88. 1 => 'тысяча',
  89. 2 => 'тысячи',
  90. 5 => 'тысяч'
  91. ),
  92. 3 => array(
  93. 1 => 'миллион',
  94. 2 => 'миллиона',
  95. 5 => 'миллионов'
  96. )
  97. );
  98. $resultArray = array();
  99. $numbersInNumber = ceil(mb_strlen($number)/3);
  100. for ($i=1; $i<=$numbersInNumber; $i++) {
  101. if ($i == 1){
  102. $numberForWork = $number%1000;
  103. $wordAfterNumber = inclineWord($numberForWork, $rubles);
  104. } else {
  105. if ($i == 2) {
  106. $isFemale = 1;
  107. } else {
  108. $isFemale = 0;
  109. }
  110. $numberForWork = ($number%(pow(1000, $i))-$number%(pow(1000, $i-1)))/(pow(1000, $i-1));
  111. $wordAfterNumber = inclineWord($numberForWork, $bigNumbers[$i]);
  112. }
  113. $wordNumber = smallNumberToText($numberForWork, $isFemale);
  114. $smallNumberResult = $wordNumber . ' ' . $wordAfterNumber;
  115. $resultArray[$i] = $smallNumberResult;
  116. }
  117. krsort ($resultArray);
  118. $result = implode(' ', $resultArray);
  119. return $result;
  120. }
  121.  
  122. /* Вызовем функцию несколько раз */
  123. $amount1 = mt_rand(1,99999999);
  124. $text1 = numberToText($amount1);
  125.  
  126. echo "На вашем счету {$text1}<br>";
  127.  
  128. $amount2 = mt_rand(1,99999999);
  129. $text2 = numberToText($amount2);
  130.  
  131. echo "На вашем счету {$text2}<br>";
  132.  
  133. $amount3 = mt_rand(1,99999999);
  134. $text3 = numberToText($amount3);
  135.  
  136. echo "На вашем счету {$text3}<br>";
  137.  
  138. $amount4 = mt_rand(1,99999999);
  139. $text4 = numberToText($amount4);
  140.  
  141. echo "На вашем счету {$text4}<br>";
  142.  
  143. ?>
Runtime error #stdin #stdout #stderr 0s 82560KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
PHP Fatal error:  Uncaught Error: Call to undefined function mb_internal_encoding() in /home/SLEsw0/prog.php:3
Stack trace:
#0 {main}
  thrown in /home/SLEsw0/prog.php on line 3