fork(1) download
  1. <?php
  2.  
  3. // Staring straight up into the sky ... oh my my
  4.  
  5.  
  6. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  7. function inclineWord($number, $word1, $word2, $word5) {
  8.  
  9. $last2Digits = $number % 100;
  10.  
  11. if(preg_match("/^1$|21|31|41|51|61|71|81|91/",$last2Digits)){
  12. if(preg_match("/^1$|21|31|41|51|61|71|81|91/",$last2Digits) && $word1=="тысяча"){ $numberEnd = smallNumberToText($number,1)." {$word1}";}
  13. else{$numberEnd = smallNumberToText($number,0)." {$word1}";}
  14. }
  15. else if(preg_match("/^[2-4]$|2[2-4]|3[2-4]|4[2-4]|5[2-4]|6[2-4]|7[2-4]|8[2-4]|9[2-4]/",$last2Digits))
  16. {
  17. if(preg_match("/^2$|22|32|42|52|62|72|82|92/",$last2Digits) && $word2=="тысячи"){$numberEnd = smallNumberToText($number,1)." {$word2}";}
  18. else{$numberEnd = smallNumberToText($number,0)." {$word2}";}
  19. }
  20. else if(preg_match("/^[5-9]$|0|[1-9]0|1[0-9]|2[5-9]|3[5-9]|4[5-9]|5[5-9]|6[5-9]|7[5-9]|8[5-9]|9[5-9]/",$last2Digits))
  21. {
  22. $numberEnd = smallNumberToText($number,0)." {$word5}";
  23. }
  24.  
  25. return $numberEnd;
  26. }
  27.  
  28. /*
  29.   Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  30.   если мы считаем число для мужского рода (один рубль),
  31.   и 1 — для женского (одна тысяча)
  32. */
  33. function smallNumberToText($number, $isFemale) {
  34.  
  35. $spelling = array(
  36. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  37. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  38. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  39. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  40. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  41. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  42. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  43. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  44. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  45. 9 => 'девять', 19 => 'девятнадцать'
  46. );
  47.  
  48. $femaleSpelling = array(
  49. 1 => 'одна', 2 => 'две'
  50. );
  51.  
  52. $thousand = floor($number/100)*100;
  53.  
  54. if(($number-$thousand)<10 || ($number-$thousand)>19){
  55. $ten = floor(($number-$thousand)/10)*10;
  56. }else{
  57. $ten = $number-$thousand;
  58. }
  59. $oneUnit = $number-$thousand-$ten;
  60.  
  61. if($thousand==0){
  62. $thousandText = "";
  63. }else{
  64. $thousandText = $spelling[$thousand];
  65. }
  66.  
  67. if($ten==0){
  68. $tenText = "";
  69. }else{
  70. $tenText = $spelling[$ten];
  71. }
  72.  
  73. if($oneUnit==0){
  74. $oneUnitText = "";
  75. }else{
  76. if($isFemale==1){
  77. $oneUnitText = $femaleSpelling[$oneUnit];
  78. }else{
  79. $oneUnitText = $spelling[$oneUnit];
  80. }
  81. }
  82.  
  83. return $thousandText." ".$tenText." ".$oneUnitText;
  84. }
  85.  
  86. function numberToText($number) {
  87. $millionsText="";
  88. $thousandsText="";
  89. $hundredsText="";
  90. if($number == 0){
  91. return "ноль рублей";
  92. }
  93. $millions = floor($number / 1000000);
  94. if($millions!=0){
  95. $millionsText = inclineWord($millions,"миллион","миллиона","миллионов");
  96. }
  97.  
  98. $thousands = floor(($number - $millions*1000000) / 1000);
  99. if($thousands!=0){
  100. $thousandsText = inclineWord($thousands,"тысяча","тысячи","тысячь");
  101. }
  102.  
  103. $hundreds = $number - ($millions*1000000) - ($thousands*1000);
  104. if($hundreds!=0){
  105. $hundredsText = inclineWord($hundreds,"рубль","рубля","рублей");
  106. }
  107.  
  108. return "{$millionsText} {$thousandsText} {$hundredsText}";
  109. }
  110.  
  111. /* Вызовем функцию несколько раз */
  112. $amount1 = mt_rand(1,99999999);
  113. $text1 = numberToText($amount1);
  114.  
  115. echo "На вашем счету {$text1}\n";
  116.  
  117. $amount2 = mt_rand(1,99999999);
  118. $text2 = numberToText($amount2);
  119.  
  120. echo "На вашем счету {$text2}\n";
  121.  
  122. $amount3 = mt_rand(1,99999999);
  123. $text3 = numberToText($amount3);
  124.  
  125. echo "На вашем счету {$text3}\n";
  126.  
  127. $amount4 = mt_rand(1,99999999);
  128. $text4 = numberToText($amount4);
  129.  
  130. echo "На вашем счету {$text4}\n";
Success #stdin #stdout 0.02s 24192KB
stdin
Standard input is empty
stdout
На вашем счету  десять  миллионов двести  семь тысячь сто восемьдесят пять рублей
На вашем счету  пятьдесят один миллион восемьсот семнадцать  тысячь восемьсот  три рубля
На вашем счету  пятьдесят девять миллионов  сорок пять тысячь  семьдесят семь рублей
На вашем счету   один миллион девятьсот шестьдесят восемь тысячь двести семьдесят пять рублей