fork download
  1. <?php
  2.  
  3. function inclineWord($number, $words) {
  4.  
  5. if ((($number % 10) == 1) && (($number % 100) != 11)) {
  6.  
  7. $type = 0;
  8.  
  9. } elseif ((($number % 10) > 1) && (($number % 10) < 5) && ((($number % 100) < 12) || (($number % 100) > 14))) {
  10.  
  11. $type = 1;
  12.  
  13. } else {
  14.  
  15. $type = 2;
  16.  
  17. }
  18.  
  19. return $words[$type];
  20.  
  21. }
  22.  
  23. function smallNumberToText($number, $isFemale) {
  24.  
  25. $spelling = array(
  26. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  27. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  28. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  29. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  30. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  31. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  32. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  33. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  34. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  35. 9 => 'девять', 19 => 'девятнадцать'
  36. );
  37.  
  38.  
  39. $femaleSpelling = array(
  40.  
  41. 1 => 'одна', 2 => 'две'
  42.  
  43. );
  44.  
  45. krsort($spelling);
  46.  
  47. if ($number > 0) {
  48.  
  49. foreach ($spelling as $delimeter => $string) {
  50.  
  51. if (($delimeter > 0 ) && (($number / $delimeter) >= 1)) {
  52.  
  53. $remain = ($number % $delimeter);
  54.  
  55. $return[] = $string;
  56.  
  57. if ($remain > 20) {
  58.  
  59. $return[] = smallNumberToText($remain, $isFemale);
  60.  
  61. } elseif ($remain > 0) {
  62.  
  63. if (($isFemale == 1) && isset($femaleSpelling[$remain])) {
  64.  
  65. $return[] = $femaleSpelling[$remain];
  66.  
  67. } else {
  68.  
  69. $return[] = $spelling[$remain];
  70.  
  71. }
  72.  
  73. }
  74.  
  75. break;
  76.  
  77. }
  78.  
  79. }
  80.  
  81. } else {
  82.  
  83. $return[] = $spelling[0];
  84.  
  85. }
  86.  
  87. return implode(" ",$return);
  88.  
  89. }
  90.  
  91.  
  92. function numberToText($number) {
  93.  
  94. $rubles = array('рубль','рубля','рублей');
  95.  
  96. $bigNumbers = array(
  97. 1000 => array ('тысяча', 'тысячи', 'тысяч'),
  98. 1000000 => array ('миллион', 'миллиона', 'миллионов'),
  99. 1000000000 => array ('миллиард', 'миллиарда', 'миллиардов')
  100. );
  101.  
  102. krsort($bigNumbers);
  103.  
  104. $initNumber = $number;
  105.  
  106. if ($number > 999) {
  107.  
  108. foreach ($bigNumbers as $delimeter => $string) {
  109.  
  110. $isFemale = 0; // по умолчанию мужской род, т.к. женский только для тысяч
  111.  
  112. if (($count = $number / $delimeter) >= 1) {
  113.  
  114. $remain = ($number % $delimeter);
  115.  
  116. if ($delimeter == 1000) { $isFemale = 1; }
  117.  
  118. $return[] = smallNumberToText(floor($count), $isFemale) . " " . inclineWord(floor($count),$string);
  119.  
  120. $number = $remain;
  121.  
  122. }
  123.  
  124. }
  125.  
  126. }
  127.  
  128. $stringNumber = smallNumberToText($number, 0);
  129.  
  130.  
  131. if (isset($return)) {
  132.  
  133. return implode(" ", $return) . " $stringNumber ($initNumber) " . inclineWord($initNumber, $rubles);
  134.  
  135. } else {
  136.  
  137. return "$stringNumber ($initNumber) " . inclineWord($initNumber, $rubles);
  138.  
  139. }
  140.  
  141. }
  142.  
  143. /* Вызовем функцию несколько раз */
  144. $amount1 = mt_rand(999999999,99999999999);
  145. $text1 = numberToText($amount1);
  146.  
  147. echo "На вашем счету {$text1}\n";
  148.  
  149. $amount2 = mt_rand(1,9999999);
  150. $text2 = numberToText($amount2);
  151.  
  152. echo "На вашем счету {$text2}\n";
  153.  
  154. $amount3 = mt_rand(1,9999999);
  155. $text3 = numberToText($amount3);
  156.  
  157. echo "На вашем счету {$text3}\n";
  158.  
  159. $amount4 = 1000001;
  160. $text4 = numberToText($amount4);
  161.  
  162. echo "На вашем счету {$text4}\n";
  163.  
  164. $amount5 = 550;
  165. $text5 = numberToText($amount5);
  166.  
  167. echo "На вашем счету {$text5}\n";
  168.  
  169.  
Success #stdin #stdout 0.02s 52432KB
stdin
Standard input is empty
stdout
На вашем счету один миллиард шестьдесят один миллион сто восемьдесят тысяч восемьсот двадцать два (1061180822) рубля
На вашем счету шесть миллионов шестьсот тридцать семь тысяч сто пятьдесят семь (6637157) рублей
На вашем счету два миллиона сто двадцать пять тысяч восемьсот тридцать шесть (2125836) рублей
На вашем счету один миллион один (1000001) рубль
На вашем счету пятьсот пятьдесят (550) рублей