<?php
header("Content-Type: text/plain");
mb_internal_encoding('utf-8');

  
/* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
function inclineWord($number, $word) {
    
    if (($number % 10 >= 5) | 
        ($number % 10 < 5 & $number % 100 < 21))  {
        
        $incline=5;
        
    } elseif (($number % 10 == 2 & $number % 100 != 12) |
              ($number % 10 == 3 & $number % 100 != 13) |
              ($number % 10 == 4 & $number % 100 != 14)) {
        
        $incline=2;
        
    } elseif ($number % 10 == 1 & $number % 100 != 11) {
        
        $incline=1;
    }
    
    if ($incline == 5 )  {
        $word = str_replace('миллион', 'миллионов', $word);
        $word = str_replace('тысяча', 'тысяч', $word);
        $word = str_replace('рубль', 'рублей', $word);
    }  elseif ($incline == 2 ) {
        $word = str_replace('миллион', 'миллиона', $word);
        $word = str_replace('тысяча', 'тысячи', $word);
        $word = str_replace('рубль', 'рубля', $word);
    } elseif ($incline == 1 ) {
        $word = str_replace('миллион', 'миллион', $word);
        $word = str_replace('тысяча', 'тысяча', $word);
        $word = str_replace('рубль', 'рубль', $word);   
    } elseif ($incline == 0 ) {
        $word = str_replace('рубль', 'рублей', $word);
    }

    return $word;
    
}
 
/* 
    Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю, 
    если мы считаем число для мужского рода (один рубль), 
    и 1 — для женского (одна тысяча) 
*/
function smallNumberToText($number, $isFemale) {
 
    $spelling = array(
        0   =>  'ноль',                                     10  =>  'десять',       100 =>  'сто',
        1   =>  'один',         11  =>  'одиннадцать',      20  =>  'двадцать',     200 =>  'двести',
        2   =>  'два',          12  =>  'двенадцать',       30  =>  'тридцать',     300 =>  'триста',
        3   =>  'три',          13  =>  'тринадцать',       40  =>  'сорок',        400 =>  'четыреста',
        4   =>  'четыре',       14  =>  'четырнадцать',     50  =>  'пятьдесят',    500 =>  'пятьсот',
        5   =>  'пять',         15  =>  'пятнадцать',       60  =>  'шестьдесят',   600 =>  'шестьсот',
        6   =>  'шесть',        16  =>  'шестнадцать',      70  =>  'семьдесят',    700 =>  'семьсот',    
        7   =>  'семь',         17  =>  'семнадцать',       80  =>  'восемьдесят',   800 =>  'восемьсот',
        8   =>  'восемь',       18  =>  'восемнадцать',     90  =>  'девяносто',     900 =>  'девятьсот',
        9   =>  'девять',       19  =>  'девятнадцать'    
    );
 
    $femaleSpelling = array(
        1   =>  'одна',        2   =>  'две'
    );
     
    //нормализация числа
    $number = ($number/100)*100;

    if ($number>=100) {
        
        if (($number % 100)==0) {
            $number000 = strtr($number, $spelling); 
            $text = $number000;
        } else {
            
            $number000 = (floor($number/100))*100; 
            $number000 = strtr($number000, $spelling); 
            
            $number00 = $number % 100;
            
            if ($number00>19) {
                
                if (($number % 10)==0) {
                    $number00 = strtr($number00, $spelling);           
                } else {
                    $number00 = (floor($number00/10))*10;  
                    $number00 = strtr($number00, $spelling);
                    
                    $number0 = $number % 10; 
                    if ($isFemale==1 & $number0 <=2) { 
                        $number0 = strtr($number0, $femaleSpelling); 
                    } else {
                        $number0 = strtr($number0, $spelling);
                    }
                    $number00 = $number00 . " " . $number0; 
                }
                
            } elseif ($number00<=19) {
                
                if ($isFemale==1 & $number00 <=2) {
                    $number00 = strtr($number00, $femaleSpelling); 
                } else {
                    $number00 = strtr($number00, $spelling);
                }
            }
            
            $number000 = $number000 . " " . $number00;
        }
        $text = $number000 ;
    
    }elseif ($number>19 & $number<100) {
        
        if (($number % 10)==0) {
            $number00 = strtr($number, $spelling); 
            
        } else {
            $number00 = (floor($number/10))*10;
            $number00 = strtr($number00, $spelling);
            
            $number0 = $number % 10;
            if ($isFemale==1 & $number0 <=2) {
               $number0 = strtr($number0, $femaleSpelling); 
            } else {
                $number0 = strtr($number0, $spelling);
            }      
            $number00 = $number00 . " " . $number0; 
        }       
        $text = $number00; 
        
    } elseif ($number<=19) {
        
        if ($isFemale==1 & $number <=2) {
            $number = strtr($number, $femaleSpelling); 
        } else {
            $number = strtr($number, $spelling);
        }
        $text = $number; 
    }
    return $text;
}

// проверяем чмсло на разрядность
function bitNumber ($number) {
    $bitNumber = 1;    
    while ($number>=10) {
        $number = $number/10; 
        $bitNumber++;
    }
    //echo "$bitNumber\n";
    return $bitNumber;
}

function numberToText($number) {
    
    $text="";
    $bitNumber = bitNumber ($number); // определяем кол-во разрядов в числе   
    $position = 0;  // текущее положение каретки = 0
    
    // продолжаем вакханалию пока положение каретки < количества символов //1234567
     while ($position < mb_strlen($number)) {
        
        if (((mb_strlen($number) - $position) % 3) == 0 ) { // кратно трем
            $len = 3;
        } elseif (mb_strlen($number) < 3) { // меньше 1000
            $len = mb_strlen($number);
        } elseif (mb_strlen($number) > 3) { // больше 1000
            $len = mb_strlen($number) - (floor(mb_strlen($number)/3) * 3);
        }
    
        //отняимес слева $количество_символов -> переименовываем в согласно разряду
        $pieceNumber = mb_substr($number, $position, $len);
        $word = smallNumberToText($pieceNumber, $bitNumber);
        
         // распределяем по порядку разрядов и добавляем миллион, тысяч и рублей
        if ($bitNumber >= 7) {
            $word = smallNumberToText($pieceNumber, 0) . " " . "миллион";
        } elseif ($bitNumber >= 4) {
            $word = smallNumberToText($pieceNumber, 1) . " " . "тысяча";
        } elseif ($bitNumber < 4) {
            $word = smallNumberToText($pieceNumber, 0) . " " . "рубль";        
        }
         // отправляем число 265 в функция_склонения
        $word = inclineWord($pieceNumber, $word);       
    
        //уменьшаем разряд на $количество отнятых символов
        $bitNumber -= $len;
    
        //переводим каретку на + $количество_символов вправо
        $position += $len;
    
        //Склеиваем строку
        $text .= $word . " ";
    }    
    return $text;
}

 
//Вызовем функцию несколько раз 
$amount1 = mt_rand(1,99999999);
$text1 = numberToText($amount1);
 
echo "На вашем счету {$amount1} {$text1}\n";
 
$amount2 = mt_rand(1,99999999);
$text2 = numberToText($amount2);
 
echo "На вашем счету {$amount2} {$text2}\n";
 
$amount3 = mt_rand(1,99999999);
$text3 = numberToText($amount3);
 
echo "На вашем счету {$amount3} {$text3}\n";
 
$amount4 = mt_rand(1,99999999);
$text4 = numberToText($amount4);
 
echo "На вашем счету {$amount4} {$text4}\n";

?>