<?php
    /*
        Задача: Дана сумма, находящаяся в банке на счету, в рублях. Вывести ее в текстовом виде вроде "шестнадцать миллионов десять тысяч три (16010003) рубля".
        
        Решал: с 2.09.16 по 3.09.16
    */
    
    error_reporting(-1);
    header('Content-Type: text/html; charset=utf-8');
    
    function spellSmallNumber($number, $isFemale)
    {
        $result = array();
    
        $spelling = array(
            0   => 'ноль',          1   => 'один',            2 => 'два', 
            3   => 'три',           4   => 'четыре',          5 => 'пять',
            6   => 'шесть',         7   => 'семь',            8 => 'восемь',
            9   => 'девять',        10  => 'десять',         11 => 'одиннадцать',
            12  => 'двенадцать',    13  => 'тринадцать',     14 => 'четырнадцать',
            15  => 'пятнадцать',    16  => 'шестнадцать',    17 => 'семнадцать',
            18  => 'восемнадцать',  19  => 'девятнадцать',   20 => 'двадцать',
            30  => 'тридцать',      40  => 'сорок',          50 => 'пятьдесят',
            60  => 'шестьдесят',    70  => 'семьдесят',      80 => 'восемьдесят',
            90  => 'девяносто',     100 => 'сто',           200 => 'двести',
            300 => 'триста',        400 => 'четыреста',     500 => 'пятьсот',
            600 => 'шестьсот',      700 => 'семьсот',       800 => 'восемьсот',
            900 => 'девятсот'
        );
        
        $femaleSpelling = array(
            1 => 'одна', 2 => 'две'
        );
            
        if ($number == 0) {
            $result[] = $spelling[$number];
        }    
            
        $hundreds = floor($number / 100) * 100;
        if ($hundreds != 0) {
            $result[] = $spelling[$hundreds];
        }
        
        $lastTwoDigit = $number % 100;
        if (($lastTwoDigit >= 11 && $lastTwoDigit <= 20) || (($lastTwoDigit % 10 == 0) && $lastTwoDigit != 0)) {
            $result[] = $spelling[$lastTwoDigit];
        } else {
            $tens = floor($lastTwoDigit / 10) * 10;
        
            if ($tens != 0) {
                $result[] = $spelling[$tens];
            }
        
            $units = $lastTwoDigit % 10;

            if ($units != 0) {
                if ($isFemale && ($units == 1 || $units == 2)) {
                    $result[] = $femaleSpelling[$units];
                } else {
                    $result[] = $spelling[$units];
                }
            } 
        }
        
        $text = implode(' ', $result);
        return $text;
    }
    
    function inclineWord($number, $word1, $word2, $word5)
    {
         $lastTwoDigit = $number % 100;
         
        if ($lastTwoDigit >= 11 && $lastTwoDigit <= 14) {
            return $word5;
        } elseif ($lastTwoDigit % 10 == 1) {
            return $word1;
        } elseif ($lastTwoDigit % 10 >= 2 && $lastTwoDigit % 10 <= 4) {
            return $word2;
        } else {
            return $word5;
        }
    }
    
    function numberToText($number)
    {
        $result = '';
        
        $numberClass = array(
            0 => array('', '', ''),
            1 => array(' тысяча ', ' тысячи ', ' тысяч '),
            2 => array(' миллион ', ' миллиона ', ' миллионов ')
        );
        
        $workNumber = $number;
        $numberArray = array();
        
        while ($workNumber > 999) {
            $numberArray[] = $workNumber % 1000;
            $workNumber = (int) floor($workNumber / 1000); 
        }
        $numberArray[] = $workNumber;
        
        for ($i =  count($numberArray) - 1; $i >= 0; $i--) {
            if ($i == 1) {
                $isFemale = 1;
            } else {
                $isFemale = 0;
            }            
            if (count($numberArray) > 1 && $numberArray[$i] == 0) {
                continue;
            }
            $result .= spellSmallNumber($numberArray[$i], $isFemale) . inclineWord($numberArray[$i], $numberClass[$i][0], $numberClass[$i][1], $numberClass[$i][2]);
        }
        
        $result = $result .  " ($number) " . inclineWord($number, 'рубль', 'рубля', 'рублей'); 
        return $result;
    }
    
    $number = mt_rand(0, 999999999);    
    $result = numberToText($number);    
    echo "На вашем счету: $result\n";
    
    $number = mt_rand(0, 99999999);    
    $result = numberToText($number);    
    echo "На вашем счету: $result\n";
    
    $number = mt_rand(0, 9999999);    
    $result = numberToText($number);    
    echo "На вашем счету: $result\n";
    
    $number = mt_rand(0, 9999999);    
    $result = numberToText($number);    
    echo "На вашем счету: $result\n";
    
    $number = mt_rand(0, 999999);    
    $result = numberToText($number);    
    echo "На вашем счету: $result\n";