<?php

mb_internal_encoding('utf-8');
header("Content-Type: text/plain; charset=UTF-8");

/* Возвращает соответствующую числу форму слова, например: 1 рубль, 2 рубля, 5 рублей. */
function inclineWord($number, $word1, $word2, $word5)
{
    $numberOneLastDigit =   $number % 10;
    $numberTwoLastDigits =  $number % 100;

    if ($numberTwoLastDigits > 10 && $numberTwoLastDigits < 20) {
        return $word5;
    }

    if ($numberOneLastDigit == 1) {
        return $word1;
    }

    if ($numberOneLastDigit > 1 && $numberOneLastDigit < 5) {
        return $word2;
    }

    return $word5;
}

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

    $number = intval($number);

    $numberLastDigit =  $number % 10;
    $numberTens =       $number % 100;
    $numberHuns =       $number % 1000;

    $numberTensRound = $numberTens - $numberLastDigit;
    $numberHunsRound = $number - $numberTens;

    $result = '';

    if ($number == 0) {
        return $spelling[0];
    }

    if ($number >= 100) {
        $result .= "{$spelling[$numberHunsRound]} ";
    }

    if ($numberTens >= 10 && $numberTens <= 20) {
        $result .= "{$spelling[$numberTens]}";
        return $result;
    }

    if ($numberTens >= 20) {
        $result .= "{$spelling[$numberTensRound]} ";
    }

    if ($isFemale && ($numberLastDigit == 1 || $numberLastDigit == 2)) {
        $result .= "$femaleSpelling[$numberLastDigit]";
        return $result;
    }

    if ($numberLastDigit > 0) {
        $result .= "{$spelling[$numberLastDigit]}";
    }

    return $result;
}

function numberToText($number)
{
    $result = '';

    $numberHuns = $number % 1000;
    $numberThos = floor($number / 1000) % 1000;
    $numberMils = floor(floor($number / 1000) / 1000);

    $rubs = inclineWord($numberHuns, "рубль", "рубля", "рублей");
    $thos = inclineWord($numberThos, "тысяча", "тысячи", "тысяч");
    $mils = inclineWord($numberMils, "миллион", "миллиона", "миллионов");

    if ($number == 0) {
        $result = smallNumberToText(0, 0);
    }

    if ($numberMils != 0) {
        $numberToText = smallNumberToText($numberMils, 0);
        $result .= "$numberToText $mils ";
    }

    if ($numberThos != 0) {
        $numberToText = smallNumberToText($numberThos, 1);
        $result .= "$numberToText $thos ";
    }

    if ($numberHuns != 0) {
        $numberToText = smallNumberToText($numberHuns, 0);
        $result .= "$numberToText";
    }

    $result .= " ($number) $rubs";

    /* Грязный хак для удаления лишних пробелов */
    $result = preg_replace('/\\s+/', " ", $result);

    return $result;
}

for ($i=0; $i<10; $i++) {
    $rand = mt_rand(1, 999999999);
    echo numberToText($rand) . "\n";
}

echo "\n";
echo numberToText(1) . "\n";
echo numberToText(100) . "\n";
echo numberToText(1000) . "\n";
echo numberToText(1002) . "\n";
echo numberToText(1000013) . "\n";
echo numberToText(1001000) . "\n";
echo numberToText(1002001) . "\n";
echo numberToText(0) . "\n";