fork download
  1. <?php
  2.  
  3. /* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
  4. function inclineWord($number, $word1, $word2, $word5) {
  5. if(($number%100)<=20) //если два посл. числа <=20, то сравниваем их
  6. $n=$number%100;
  7. else
  8. $n=$number%10; //иначе сравниваем последнее число
  9.  
  10. if ($n==1)
  11. $text=$word1;
  12. elseif ($n>1 && $n<5)
  13. $text=$word2;
  14. else
  15. $text=$word5;
  16. return $text." ";
  17. }
  18.  
  19. /*
  20.   Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
  21.   если мы считаем число для мужского рода (один рубль),
  22.   и 1 — для женского (одна тысяча)
  23. */
  24. function smallNumberToText($number, $isFemale) {
  25.  
  26. $spelling = array(
  27. 0 => 'ноль', 10 => 'десять', 100 => 'сто',
  28. 1 => 'один', 11 => 'одиннадцать', 20 => 'двадцать', 200 => 'двести',
  29. 2 => 'два', 12 => 'двенадцать', 30 => 'тридцать', 300 => 'триста',
  30. 3 => 'три', 13 => 'тринадцать', 40 => 'сорок', 400 => 'четыреста',
  31. 4 => 'четыре', 14 => 'четырнадцать', 50 => 'пятьдесят', 500 => 'пятьсот',
  32. 5 => 'пять', 15 => 'пятнадцать', 60 => 'шестьдесят', 600 => 'шестьсот',
  33. 6 => 'шесть', 16 => 'шестнадцать', 70 => 'семьдесят', 700 => 'семьсот',
  34. 7 => 'семь', 17 => 'семнадцать', 80 => 'восемьдесят', 800 => 'восемьсот',
  35. 8 => 'восемь', 18 => 'восемнадцать', 90 => 'девяносто', 900 => 'девятьсот',
  36. 9 => 'девять', 19 => 'девятнадцать'
  37. );
  38.  
  39. $femaleSpelling = array(
  40. 1 => 'одна', 2 => 'две'
  41. );
  42.  
  43.  
  44. $text="";
  45. if ($number==0) //при нуле сразу пишем результат
  46. $text.=$spelling[0]." ";
  47. else{
  48. if($number<20) //1-20 => не режем, а сразу...
  49. $n[1]=$number;
  50. else{ //больше 21, режем числа на цифры и...
  51. $n[1]=$number-($number%100);
  52. $n[2]=($number%100)-($number%10);
  53. $n[3]=$number%10;
  54. }
  55.  
  56. foreach ($n as $key=>$value){ //... склеиваем слова
  57. if ($n[$key]!=0){
  58. if ($isFemale &&($n[$key]==1||$n[$key]==2)) //для одна/две тысячи
  59. $text.=$femaleSpelling[$n[$key]]." ";
  60. else
  61. $text.=$spelling[$n[$key]]." ";
  62. }
  63.  
  64. }
  65.  
  66. }
  67.  
  68. return $text;
  69. }
  70.  
  71. function numberToText($number) {
  72. $first=$number % 1000;
  73. $second=floor($number % 1000000/1000);
  74. $third=floor($number/1000000);
  75.  
  76. $text='';
  77. if($number==0)
  78. $text.=smallNumberToText($number,0);
  79. else{
  80. if ($third>0){
  81. $text.=smallNumberToText($third,0);
  82. $text.=inclineWord($third,"миллион","миллиона","миллионов");
  83. }
  84.  
  85.  
  86. if ($second>0){
  87. $text.=smallNumberToText($second,1);
  88. $text.=inclineWord($second,"тысяча","тысячи","тысяч");
  89. }
  90.  
  91. if ($first>0)
  92. $text.=smallNumberToText($first,0);
  93. }
  94. $text.=inclineWord($number,"рубль","рубля","рублей");
  95.  
  96. return $text;
  97. }
  98.  
  99. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100.  
  101. $test=array(123456789,999999999, 0, 1, 11012013, 7000008, 1002, 1000, 7000000,550);
  102. foreach ($test as $key=>$value){
  103. $text = numberToText($test[$key]);
  104. echo $value." На вашем счету {$text}\n";
  105. }
Success #stdin #stdout 0.02s 52432KB
stdin
Standard input is empty
stdout
123456789 На вашем счету сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять рублей 
999999999 На вашем счету девятьсот девяносто девять миллионов девятьсот девяносто девять тысяч девятьсот девяносто девять рублей 
0 На вашем счету ноль рублей 
1 На вашем счету один рубль 
11012013 На вашем счету одиннадцать миллионов двенадцать тысяч тринадцать рублей 
7000008 На вашем счету семь миллионов восемь рублей 
1002 На вашем счету одна тысяча два рубля 
1000 На вашем счету одна тысяча рублей 
7000000 На вашем счету семь миллионов рублей 
550 На вашем счету пятьсот пятьдесят рублей