fork download
  1. <?php
  2.  
  3.  
  4. /*Глобальная функция, которая получает число $n и возвращает текстовую форму написания суммы*/
  5. function summ_to_text ($n) {
  6.  
  7. /*Эта функция разбивает число на группы трехзначных чисел*/
  8. function splittingIntoGroups ($n) {
  9.  
  10. $splitArray=[];
  11. for ($i=$n; $i>=1; $i=$i+0) {
  12. $i=$i/1000;
  13. $t=round(1000*fmod($i,1));
  14. $i=floor($i);
  15. $splitArray[]=$t;
  16. }
  17. return $splitArray;
  18. }
  19.  
  20. /*Эта функция определяет правильную форму имени разряда суммы для числа $dischargeValue из ячейки $x массива $dischargeArray*/
  21. function discharge_sum ($dischargeValue,$x) {
  22. $dischargeArray= [ 'roubles'=> ['рубль', 'рубля', 'рублей'],
  23. 'thousand'=> ['тысяча','тысячи','тысяч'],
  24. 'million'=> ['миллион','миллиона','миллионов']
  25. ];
  26. $regexpLastNumber1='/^[1]$/';
  27. $regexpLastNumber2to4='/^[0]?[0]?[2-4]$/';
  28. $regexpLastNumber10to19='/[0-9]?[1][0-9]$/';
  29. $regexpLastNumberX1='/[0-9]?[0,2-9][1]$/';
  30. $regexpLastNumberX2toX4='/[0-9]?[0,2-9][2-4]$/';
  31. if (preg_match($regexpLastNumber1,$dischargeValue)){
  32. $wordAfterN=$dischargeArray[$x][0];
  33. }
  34. elseif (preg_match($regexpLastNumber2to4,$dischargeValue)){
  35. $wordAfterN=$dischargeArray[$x][1];
  36. }
  37. elseif (preg_match($regexpLastNumber10to19,$dischargeValue)){
  38. $wordAfterN=$dischargeArray[$x][2];
  39. }
  40. elseif (preg_match($regexpLastNumberX1,$dischargeValue)){
  41. $wordAfterN=$dischargeArray[$x][0];
  42. }
  43. elseif (preg_match($regexpLastNumberX2toX4,$dischargeValue)){
  44. $wordAfterN=$dischargeArray[$x][1];
  45. }
  46. elseif ($dischargeValue==null){
  47. $wordAfterN='';
  48. }
  49. else{
  50. $wordAfterN=$dischargeArray[$x][2];
  51. }
  52. return $wordAfterN;
  53. }
  54.  
  55. /*Эта функция возвращает написание трехзначных чисел из массива прописью*/
  56. function smallNumberToText ($spelN) {
  57. $spelling= [0 => 'ноль', 10 => 'десять', 100 => 'сто',
  58. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  59. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  60. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  61. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  62. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  63. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  64. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  65. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  66. 9 => 'девять', 19 => 'девятнадцать' ];
  67. $regexp1to9='/[0-9]?[0-9]?[1-9]$/';
  68. $regexp10to19= '/[0-9]?[1][0-9]$/';
  69. $regexp20to90= '/[0-9]?[2-9][0-9]$/';
  70. $regexp100to900= '/[1-9][0-9][0-9]$/';
  71.  
  72. $spelN=array_reverse($spelN);
  73. $text=null;
  74. foreach ($spelN as $n) {
  75. $numberInWords='';
  76. if (preg_match($regexp1to9,$n)) {
  77. $x=($n%100)%10;
  78. $numberInWords=$spelling[$x] . ' ';
  79. }
  80. if (preg_match($regexp10to19,$n)) {
  81. $y=floor($n%100);
  82. $numberInWords=$spelling[$y] . ' ';
  83. }
  84. if (preg_match ($regexp20to90,$n)) {
  85. $z=(floor($n%100/10))*10;
  86. $numberInWords=$spelling[$z] . ' ' . $numberInWords . ' ';
  87. }
  88. if (preg_match ($regexp100to900,$n)) {
  89. $w=(floor($n/100))*100;
  90. $numberInWords=$spelling[$w] . ' ' . $numberInWords . '';
  91. }
  92. $textArray[]=$numberInWords;
  93. }
  94. return $textArray;
  95. }
  96.  
  97. /*Эта функция меняет фразы "один тысяча" и "две тысяча" на "одна тысяча" и "две тысячи" соответственно*/
  98. function correct_thousand ($arrayN) {
  99. $regexp1thousand='/один\\s/ui';
  100. $regexp2thousand='/два\\s/ui';
  101. $arrayN[1]=preg_replace($regexp1thousand,'одна ',$arrayN[1]);
  102. $arrayN[1]=preg_replace($regexp2thousand,'две ',$arrayN[1]);
  103. return($arrayN);
  104. }
  105.  
  106. /*Эта функция удаляет лишние пробелы, которые появляются в случае отсутствия разрядов миллионов и тысяч*/
  107. function delete_double_space ($textForDeleteSpace) {
  108. $regexpDoubleSpace='/(\\s){2,}/ui';
  109. $textAfterDeleteDoubleSpace=preg_replace($regexpDoubleSpace,' ',$textForDeleteSpace);
  110. return $textAfterDeleteDoubleSpace;
  111. }
  112.  
  113. /*Получаем массив трехзначных чисел*/
  114. $splitArray= splittingIntoGroups ($n);
  115.  
  116. /*Создаем массив для записи имен разрядов*/
  117. $dischargeArraySpelN= ['roubles'=>null, 'thousand'=>null, 'million'=>null];
  118.  
  119. /*Определяем правильные имена разрядов и поочередно записываем их в массив*/
  120. $wordAfterRoubles= discharge_sum($splitArray[0],'roubles');
  121. if ($splitArray[0]==0){
  122. $wordAfterRoubles='рублей';
  123. }
  124. $dischargeArraySpelN[roubles]=$wordAfterRoubles;
  125. $wordAfterThousand= discharge_sum($splitArray[1],'thousand');
  126. $dischargeArraySpelN[thousand]=$wordAfterThousand;
  127. $wordAfterMillion= discharge_sum($splitArray[2],'million');
  128. $dischargeArraySpelN[million]=$wordAfterMillion;
  129. /*Переводим массив трехзначных чисел в текстовую форму и одновременно его переворачиваем, т.к. foreach записало массив в обратном порядке*/
  130. $numberInTextArray= array_reverse (smallNumberToText ($splitArray));
  131. /*Проверяем, нужно ли исправить окончание разряда тысяч*/
  132. $numberInTextArray= correct_thousand ($numberInTextArray);
  133. if ($n==0){
  134. $numberInTextArray[0]='0 ';
  135. }
  136. /*Собираем текст*/
  137. $text= $numberInTextArray[2].$wordAfterMillion.' '.$numberInTextArray[1].$wordAfterThousand.' '.$numberInTextArray[0].$wordAfterRoubles;
  138. /*Удаляем лишние пробелы*/
  139. $text= delete_double_space ($text);
  140.  
  141. return ($text);
  142. }
  143. $text= summ_to_text(11012013);
  144. echo ($text);
Success #stdin #stdout #stderr 0.02s 24888KB
stdin
Standard input is empty
stdout
одиннадцать миллионов двенадцать тысяч тринадцать рублей
stderr
PHP Warning:  Use of undefined constant roubles - assumed 'roubles' (this will throw an Error in a future version of PHP) in /home/sMnWXd/prog.php on line 126
PHP Warning:  Use of undefined constant thousand - assumed 'thousand' (this will throw an Error in a future version of PHP) in /home/sMnWXd/prog.php on line 128
PHP Warning:  Use of undefined constant million - assumed 'million' (this will throw an Error in a future version of PHP) in /home/sMnWXd/prog.php on line 130