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

// Числа прописью
  
/* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
function inclineWord($number, $word1, $word2, $word5) {
    
    $word = "";          //правильная форма склонения
    $lastNum = $number % 10; //последняя цифра числа
    
    if (4 < $number % 100 && $number % 100 <= 19) {
        $word = $word5;
    } elseif ($lastNum == 1) {
        $word = $word1;
    } elseif ($lastNum >= 2 && $lastNum <= 4) {
        $word = $word2;
    } elseif ($lastNum >= 5 || $lastNum == 0) {
        $word = $word5;
    }
    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   =>  'две'
    );   
    
    $numbers=array();               // числа прописью для каждого разряда    
    $text = '';                     // числа прописью строкой    
    $lastNum = $number % 10;        // последняя цифра числа    
    $lastTwoNum = $number % 100;    // последние две цифры числа
    
       
    // если в числе есть сотни, добавляем слово для сотен
    if ($number>=100) {        
        $numbers[] = $spelling[(floor($number/100))*100];        
    }
    if (11 <= $lastTwoNum && $lastTwoNum <= 19) { //... слово для 11-19        
        $numbers[] = $spelling[$lastTwoNum];
        /*
         *  если число между 11 и 19, то дальше переименовывать не нужно
         *  нижние две строчки копипастятся, это плохо? Второй вариант, это добавить
         *  else к условию, и вложить все нижеидущие условия.
         */    
        $text = implode (" ", $numbers); //склеиваем строку из массива
        return $text;  
    }         
    if (10 <= $lastTwoNum && $lastTwoNum <= 99) { //... слово десятков        
        $numbers[] = $spelling[floor(($lastTwoNum)/10)*10];
    }    
    if (1 <= $lastNum && $lastNum <= 9) { //... слово единиц
        
        if (($lastNum == 1 || $lastNum == 2) && $isFemale==1) { //... женский род         
            $numbers[] = $femaleSpelling[$lastNum];
            
        } else {            
             $numbers[] = $spelling[$lastNum];  
        }     
    }
    if ($number==0) {   //... слово для нуля     
        $numbers[] = $spelling[$number];        
    }
    
    //склеиваем строку из слов
    $text = implode (" ", $numbers);
    return $text;
}


function numberToText($number) {
    
    $i = 0;           // счетчик, сумма переименованных частей числа    
    $result = "";     // число прописью одной строкой
    $strs = array();  // разряды числа прописью
    $bit = 0;       // текущий разряд
    $words = array( 
                array("рубль", "рубля", "рублей"),
                array("тысяча", "тысячи", "тысяч"),
                array("миллион", "миллиона", "миллионов")
                        /* просто добавь разряд */
                );
    
    if ($number == 0) { // если число 0, то возвращаем результат
        return "ноль (0) рублей";
        //return smallNumberToText($number, $bit) . " ($number) " . inclineWord($number, $words[$bit][0], $words[$bit][1], $words[$bit][2]);
    }
    
    // если число > 0
    // продолжаем пока сумма всех переименованных частей числа < исходное число  
    while ($i < $number) {
        
        // берем по очереди часть числа (3 разряда начиная справа)
        $pieceNumber = floor(intval($number/(pow(1000, $bit)))) % 1000; 
   
        // если в разряде единиц-десятков-сотен все нули 
        if ($pieceNumber == 0 && $bit == 0) {
            
            // склоняем слово "рубль"
            $strs[] = "($number) " . inclineWord($number, $words[$bit][0], $words[$bit][1], $words[$bit][2]);
        }         
        
        // если в разряде не только нули
        if ($pieceNumber > 0) {
            
            // склоняем название разряда
            $word = inclineWord($pieceNumber, $words[$bit][0], $words[$bit][1], $words[$bit][2]);
            
            // добавляем число цифрами перед "рублей"
            if ($bit == 0) {
                $num = " ($number) ";                
            } else {
                $num = " ";
            }
            
            // отправляем число на переименование и добавляем название разряда 
            $strs[] = smallNumberToText($pieceNumber, $bit) . $num . $word;
        }
        
        // суммируем переименованные части числа (счетчик)
        $i += $pieceNumber*(pow(1000, $bit));
        
        // увеличиваем текущий разряд   
        $bit++;        
    }
    
    // склеиваем результат в одну строку
    $result = implode (" ", array_reverse($strs));
    return $result;
}

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

?>