fork download
  1. <?php
  2.  
  3. header("Content-Type: text/plain; charset=UTF-8");
  4.  
  5. /* Возвращает соответствующую числу форму слова, например: 1 рубль, 2 рубля, 5 рублей. */
  6. function inclineWord($number, $word1, $word2, $word5)
  7. {
  8. $numberOneLastDigit = $number % 10;
  9. $numberTwoLastDigits = $number % 100;
  10.  
  11. if ($numberTwoLastDigits > 10 && $numberTwoLastDigits < 20) {
  12. return $word5;
  13. }
  14.  
  15. if ($numberOneLastDigit == 1) {
  16. return $word1;
  17. }
  18.  
  19. if ($numberOneLastDigit > 1 && $numberOneLastDigit < 5) {
  20. return $word2;
  21. }
  22.  
  23. return $word5;
  24. }
  25.  
  26. /*
  27.   Преобразует числа от 0 до 999 в текст.
  28.   Параметр $isFemale равен "0", если мы считаем число для мужского рода (один рубль),
  29.   и равен "1" для женского (одна тысяча).
  30. */
  31. function smallNumberToText($number, $isFemale)
  32. {
  33. $spelling = array(
  34. 0 => 'ноль',
  35. 1 => 'один', 11 => 'одиннадцать', 10 => 'десять', 100 => 'сто',
  36. 2 => 'два', 12 => 'двенадцать', 20 => 'двадцать', 200 => 'двести',
  37. 3 => 'три', 13 => 'тринадцать', 30 => 'тридцать', 300 => 'триста',
  38. 4 => 'четыре', 14 => 'четырнадцать', 40 => 'сорок', 400 => 'четыреста',
  39. 5 => 'пять', 15 => 'пятнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  40. 6 => 'шесть', 16 => 'шестнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  41. 7 => 'семь', 17 => 'семнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  42. 8 => 'восемь', 18 => 'восемнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  43. 9 => 'девять', 19 => 'девятнадцать', 90 => 'девяносто', 900 => 'девятьсот'
  44. );
  45.  
  46. $femaleSpelling = array(
  47. 1 => 'одна', 2 => 'две'
  48. );
  49.  
  50. $number = intval($number);
  51.  
  52. $numberLastDigit = $number % 10;
  53. $numberTens = $number % 100;
  54. $numberHuns = $number % 1000;
  55.  
  56. $numberTensRound = $numberTens - $numberLastDigit;
  57. $numberHunsRound = $number - $numberTens;
  58.  
  59. $result = '';
  60.  
  61. if ($number == 0) {
  62. return $spelling[0];
  63. }
  64.  
  65. if ($number >= 100) {
  66. $result .= "{$spelling[$numberHunsRound]} ";
  67. }
  68.  
  69. if ($numberTens >= 10 && $numberTens <= 20) {
  70. $result .= "{$spelling[$numberTens]}";
  71. return $result;
  72. }
  73.  
  74. if ($numberTens >= 20) {
  75. $result .= "{$spelling[$numberTensRound]} ";
  76. }
  77.  
  78. if ($isFemale && ($numberLastDigit == 1 || $numberLastDigit == 2)) {
  79. $result .= "$femaleSpelling[$numberLastDigit]";
  80. return $result;
  81. }
  82.  
  83. if ($numberLastDigit > 0) {
  84. $result .= "{$spelling[$numberLastDigit]}";
  85. }
  86.  
  87. return $result;
  88. }
  89.  
  90. function numberToText($number)
  91. {
  92. $result = '';
  93.  
  94. $numberHuns = $number % 1000;
  95. $numberThos = floor($number / 1000) % 1000;
  96. $numberMils = floor(floor($number / 1000) / 1000);
  97.  
  98. $rubs = inclineWord($numberHuns, "рубль", "рубля", "рублей");
  99. $thos = inclineWord($numberThos, "тысяча", "тысячи", "тысяч");
  100. $mils = inclineWord($numberMils, "миллион", "миллиона", "миллионов");
  101.  
  102. if ($number == 0) {
  103. $result = smallNumberToText(0, 0);
  104. }
  105.  
  106. if ($numberMils != 0) {
  107. $numberToText = smallNumberToText($numberMils, 0);
  108. $result .= "$numberToText $mils ";
  109. }
  110.  
  111. if ($numberThos != 0) {
  112. $numberToText = smallNumberToText($numberThos, 1);
  113. $result .= "$numberToText $thos ";
  114. }
  115.  
  116. if ($numberHuns != 0) {
  117. $numberToText = smallNumberToText($numberHuns, 0);
  118. $result .= "$numberToText";
  119. }
  120.  
  121. $result .= " ($number) $rubs";
  122.  
  123. /* Грязный хак для удаления лишних пробелов */
  124. $result = preg_replace('/\\s+/', " ", $result);
  125.  
  126. return $result;
  127. }
  128.  
  129. for ($i=0; $i<10; $i++) {
  130. $rand = mt_rand(1, 999999999);
  131. echo numberToText($rand) . "\n";
  132. }
  133.  
  134. echo "\n";
  135. echo numberToText(1) . "\n";
  136. echo numberToText(100) . "\n";
  137. echo numberToText(1000) . "\n";
  138. echo numberToText(1002) . "\n";
  139. echo numberToText(1000013) . "\n";
  140. echo numberToText(1001000) . "\n";
  141. echo numberToText(1002001) . "\n";
  142. echo numberToText(0) . "\n";
Success #stdin #stdout 0.01s 20568KB
stdin
Standard input is empty
stdout
девяносто пять миллионов пятьсот восемьдесят три тысячи четыреста семьдесят восемь (95583478) рублей
сто восемьдесят пять миллионов четыреста четырнадцать тысяч пятьсот восемьдесят (185414580) рублей
триста пятьдесят два миллиона сто девяносто девять тысяч восемьсот семьдесят шесть (352199876) рублей
восемьсот двадцать два миллиона тридцать восемь тысяч триста шестьдесят девять (822038369) рублей
восемьсот семьдесят пять миллионов четыреста шестьдесят две тысячи двести пятьдесят один (875462251) рубль
восемьсот сорок миллионов шестьсот девяносто пять тысяч девятьсот тридцать четыре (840695934) рубля
двести семьдесят девять миллионов восемьсот сорок одна тысяча семьдесят три (279841073) рубля
шестьсот двадцать шесть миллионов пятьсот пятьдесят семь тысяч двести девяносто шесть (626557296) рублей
четыреста сорок один миллион семьсот пятьдесят одна тысяча семьсот сорок семь (441751747) рублей
семьсот двадцать девять миллионов девятьсот сорок одна тысяча восемьсот тридцать три (729941833) рубля

один (1) рубль
сто (100) рублей
одна тысяча (1000) рублей
одна тысяча два (1002) рубля
один миллион тринадцать (1000013) рублей
один миллион одна тысяча (1001000) рублей
один миллион две тысячи один (1002001) рубль
ноль (0) рублей