fork download
  1. <?php
  2.  
  3. function spellSmallNumber($number, $isFemale)
  4. {
  5. $result = array();
  6.  
  7. $spelling = array(
  8. 0 => 'ноль', 1 => 'один', 2 => 'два',
  9. 3 => 'три', 4 => 'четыре', 5 => 'пять',
  10. 6 => 'шесть', 7 => 'семь', 8 => 'восемь',
  11. 9 => 'девять', 10 => 'десять', 11 => 'одиннадцать',
  12. 12 => 'двенадцать', 13 => 'тринадцать', 14 => 'четырнадцать',
  13. 15 => 'пятнадцать', 16 => 'шестнадцать', 17 => 'семнадцать',
  14. 18 => 'восемнадцать', 19 => 'девятнадцать', 20 => 'двадцать',
  15. 30 => 'тридцать', 40 => 'сорок', 50 => 'пятьдесят',
  16. 60 => 'шестьдесят', 70 => 'семьдесят', 80 => 'восемьдесят',
  17. 90 => 'девяносто', 100 => 'сто', 200 => 'двести',
  18. 300 => 'триста', 400 => 'четыреста', 500 => 'пятьсот',
  19. 600 => 'шестьсот', 700 => 'семьсот', 800 => 'восемьсот',
  20. 900 => 'девятсот'
  21. );
  22.  
  23. $femaleSpelling = array(
  24. 1 => 'одна', 2 => 'две'
  25. );
  26.  
  27. if ($number == 0) {
  28. $result[] = $spelling[$number];
  29. }
  30.  
  31. $hundreds = floor($number / 100) * 100;
  32. if ($hundreds != 0) {
  33. $result[] = $spelling[$hundreds];
  34. }
  35.  
  36. $lastTwoDigit = $number % 100;
  37. if (($lastTwoDigit >= 11 && $lastTwoDigit <= 20) || (($lastTwoDigit % 10 == 0) && $lastTwoDigit != 0)) {
  38. $result[] = $spelling[$lastTwoDigit];
  39. } else {
  40. $tens = floor($lastTwoDigit / 10) * 10;
  41.  
  42. if ($tens != 0) {
  43. $result[] = $spelling[$tens];
  44. }
  45.  
  46. $units = $lastTwoDigit % 10;
  47.  
  48. if ($units != 0) {
  49. if ($isFemale && ($units == 1 || $units == 2)) {
  50. $result[] = $femaleSpelling[$units];
  51. } else {
  52. $result[] = $spelling[$units];
  53. }
  54. }
  55. }
  56.  
  57. $text = implode(' ', $result);
  58. return $text;
  59. }
  60.  
  61. function inclineWord($number, $word1, $word2, $word5)
  62. {
  63. $lastTwoDigit = $number % 100;
  64.  
  65. if ($lastTwoDigit >= 11 && $lastTwoDigit <= 14) {
  66. return $word5;
  67. } elseif ($lastTwoDigit % 10 == 1) {
  68. return $word1;
  69. } elseif ($lastTwoDigit % 10 >= 2 && $lastTwoDigit % 10 <= 4) {
  70. return $word2;
  71. } else {
  72. return $word5;
  73. }
  74. }
  75.  
  76. function numberToText($number)
  77. {
  78. $arrayResult = array();
  79.  
  80. $numberClass = array(
  81. 0 => array('', '', ''),
  82. 1 => array('тысяча', 'тысячи', 'тысяч'),
  83. 2 => array('миллион', 'миллиона', 'миллионов')
  84. );
  85.  
  86. $workNumber = $number;
  87. $numberArray = array();
  88.  
  89. while ($workNumber > 999) {
  90. $numberArray[] = $workNumber % 1000;
  91. $workNumber = (int) floor($workNumber / 1000);
  92. }
  93. $numberArray[] = $workNumber;
  94.  
  95. for ($i = count($numberArray) - 1; $i >= 0; $i--) {
  96. if ($i == 1) {
  97. $isFemale = 1;
  98. } else {
  99. $isFemale = 0;
  100. }
  101. if (count($numberArray) > 1 && $numberArray[$i] == 0) {
  102. continue;
  103. }
  104. $arrayResult[] = spellSmallNumber($numberArray[$i], $isFemale);
  105. $arrayResult[] = inclineWord($numberArray[$i], $numberClass[$i][0], $numberClass[$i][1], $numberClass[$i][2]);
  106. }
  107.  
  108. $result = implode(' ', $arrayResult) . " ($number) " . inclineWord($number, 'рубль', 'рубля', 'рублей');
  109. return $result;
  110. }
  111.  
  112. $number = mt_rand(0, 999999999);
  113. $result = numberToText($number);
  114. echo "На вашем счету: $result\n";
  115.  
  116. $number = mt_rand(0, 99999999);
  117. $result = numberToText($number);
  118. echo "На вашем счету: $result\n";
  119.  
  120. $number = mt_rand(0, 9999999);
  121. $result = numberToText($number);
  122. echo "На вашем счету: $result\n";
  123.  
  124. $number = mt_rand(0, 9999999);
  125. $result = numberToText($number);
  126. echo "На вашем счету: $result\n";
  127.  
  128. $number = mt_rand(0, 999999);
  129. $result = numberToText($number);
  130. echo "На вашем счету: $result\n";
Success #stdin #stdout 0.01s 52488KB
stdin
Standard input is empty
stdout
На вашем счету: двести семьдесят девять миллионов двести пятьдесят четыре тысячи семьсот двадцать один  (279254721) рубль
На вашем счету: тридцать один миллион двести тридцать три тысячи восемьсот тридцать семь  (31233837) рублей
На вашем счету: три миллиона семьсот семьдесят четыре тысячи восемьсот двадцать четыре  (3774824) рубля
На вашем счету: два миллиона семьсот восемнадцать тысяч восемьсот восемьдесят три  (2718883) рубля
На вашем счету: четыреста девяносто семь тысяч шестьдесят семь  (497067) рублей