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