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, $word3) {
  8. if ($number == 1) {
  9. return $word1;
  10. } elseif ($number > 1 && $number < 5)
  11. {
  12. return $word2;
  13. } else {
  14. return $word3;
  15. }
  16. }
  17.  
  18. /*
  19.   Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  20.   если мы считаем число для мужского рода (один рубль),
  21.   и 1 — для женского (одна тысяча)
  22.   */
  23. function smallNumberToText($number, $isFemale) {
  24.  
  25. $text = "";
  26.  
  27. $spelling = array(
  28. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  29. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  30. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  31. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  32. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  33. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  34. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  35. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  36. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  37. 9 => 'девять', 19 => 'девятнадцать'
  38. );
  39.  
  40. $femaleSpelling = array(
  41. 1 => 'одна', 2 => 'две'
  42. );
  43.  
  44. while ($number != 0) {
  45. if ($isFemale == 1 && array_key_exists($number, $femaleSpelling)) {
  46. $text .= "{$femaleSpelling[$number]} ";
  47. break;
  48. } elseif (array_key_exists($number, $spelling)) {
  49. $text .= "{$spelling[$number]} ";
  50. break;
  51. }
  52.  
  53. if ($number > 99) {
  54. $temp = $number - ($number % 100);
  55. $number -= $temp;
  56. $text .= "{$spelling[$temp]} ";
  57. } else {
  58. $temp = $number - ($number % 10);
  59. $number -= $temp;
  60. $text .= "{$spelling[$temp]} ";
  61. }
  62. }
  63.  
  64. return $text;
  65. }
  66.  
  67. function getLastDigit($number) {
  68.  
  69. if ($number > 99) {
  70. $number %= 100;
  71. }
  72.  
  73. if ($number > 19) {
  74. $number %= 10;
  75. }
  76.  
  77.  
  78. return $number;
  79. }
  80.  
  81. function getSmallerNumber($number) {
  82. if ($number > 999999) {
  83. $number /= 1000000;
  84. } else {
  85. $number /= 1000;
  86. }
  87.  
  88. return intval($number);
  89. }
  90.  
  91. function numberToText($number) {
  92.  
  93. $text = "";
  94.  
  95. if ($number == 0) {
  96. return "ноль (0) рублей";
  97. }
  98.  
  99. $originalNumber = $number;
  100.  
  101. while ($number != 0)
  102. {
  103. $smallerNumber = getSmallerNumber($number);
  104. if ($number > 999999) {
  105. $text .= smallNumberToText($smallerNumber, 0) . inclineWord(getLastDigit($smallerNumber), "миллион ", "миллиона ", "миллионов ");
  106. $number -= $smallerNumber * 1000000;
  107. } elseif ($number > 999) {
  108. $text .= smallNumberToText($smallerNumber, 1) . inclineWord(getLastDigit($smallerNumber), "тысяча ", "тысячи ", "тысяч ");
  109. $number -= $smallerNumber * 1000;
  110. } else {
  111. $text .= smallNumberToText($number, 0) . "({$originalNumber}) " . inclineWord(getLastDigit($number), "рубль", "рубля", "рублей");
  112. break;
  113. }
  114. }
  115.  
  116. return $text;
  117. }
  118.  
  119. echo numberToText(11340);
Success #stdin #stdout 0.02s 25836KB
stdin
Standard input is empty
stdout
    одиннадцать тысяч триста сорок (11340) рублей