fork 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. if ($number > 19) {
  69. return $number % 10;
  70. } else {
  71. return $number;
  72. }
  73. }
  74.  
  75. function getSmallerNumber($number) {
  76. if ($number > 999999) {
  77. $number /= 1000000;
  78. } else {
  79. $number /= 1000;
  80. }
  81.  
  82. return intval($number);
  83. }
  84.  
  85. function numberToText($number) {
  86.  
  87. $text = "";
  88.  
  89. if ($number == 0) {
  90. return "ноль (0) рублей";
  91. }
  92.  
  93. $originalNumber = $number;
  94.  
  95. while ($number != 0)
  96. {
  97. $smallerNumber = getSmallerNumber($number);
  98. if ($number > 999999) {
  99. $text .= smallNumberToText($smallerNumber, 0) . "({$originalNumber}) " . inclineWord(getLastDigit($smallerNumber), "миллион ", "миллиона ", "миллионов ");
  100. $number -= $smallerNumber * 1000000;
  101. } elseif ($number > 999) {
  102. $text .= smallNumberToText($smallerNumber, 1) . "({$originalNumber}) " . inclineWord(getLastDigit($smallerNumber), "тысяча ", "тысячи ", "тысяч ");
  103. $number -= $smallerNumber * 1000;
  104. } else {
  105. $text .= smallNumberToText($number, 0) . "({$originalNumber}) " . inclineWord(getLastDigit($number), "рубль", "рубля", "рублей");
  106. break;
  107. }
  108. }
  109.  
  110. return $text;
  111. }
  112.  
  113. echo numberToText(10);
Success #stdin #stdout 0.02s 25916KB
stdin
Standard input is empty
stdout
десять (10) рублей