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