<?php

// Staring straight up into the sky ... oh my my
error_reporting(-1);
mb_internal_encoding('utf-8');


/* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
function inclineWord($number, $word1, $word2, $word3)
{
    $number %= 100;
    //до 20
    if ($number < 20) {
        if ($number == 1) {
            return $word1;
        } elseif (($number < 5) && ($number != 0)) {
            return $word2;
        } else {
            return $word3;
        }
    } else {
        //если больше 20 то только по последней цифре.
        $number %= 10;
        if ($number == 1) {
            return $word1;
        } elseif (($number < 5) && ($number != 0)) {
            return $word2;
        } else {
            return $word3;
        }
    }
}

/*
  Преобразует числа от 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 => 'две'
    );

    if($number == 0) {
        return null;
    }

    $strNum = '';
    $hundred = floor($number / 100);
    $dec = floor(($number % 100) / 10);
    $firstNumber = $number % 10;
    if ($hundred) {
        $key = $hundred * 100;
        $strNum .= $spelling[$key] . ' ';
        if (($number % 100) == 0) {
            return $strNum;
        }
    }

    if ($dec) {
        if ($dec == 1) {
            $key = $number % 100;
            $strNum .= $spelling[$key] . ' ';
        } else {
            $key = $dec * 10;
            $strNum .= $spelling[$key] . ' ';
        }
        if (!$firstNumber) {
            return $strNum;
        }
    }

    if ($dec != 1) {
        if ((($firstNumber == 1) or ($firstNumber == 2)) and ($isFemale == 1)) {
            $strNum .= $femaleSpelling[$firstNumber] . ' ';
        } else {
            $strNum .= $spelling[$firstNumber];
        }
    }
    return $strNum;
}

function numberToText($number)
{
    if ($number == 0) {
        return '0 рублей';
    }
    $number = number_format($number);
    $millions = '';
    $thousand = '';
    $hundred = '';
    $numbers = preg_split('/,/', $number, 0, PREG_SPLIT_NO_EMPTY);
    //Миллионы
    if (count($numbers) > 2) {
        $triad = array_shift($numbers);
        $millions = smallNumberToText($triad, 0);
        $millions .= ' ' . inclineWord($triad, 'миллион', 'миллиона', 'миллионов');
    }
    //тысячи
    if (count($numbers) > 1) {
        $triad = array_shift($numbers);
        $lastNum = preg_split('//', $triad);
        $lastNum = end($lastNum);
        if ($lastNum < 2) {
            $thousand = smallNumberToText($triad, 1);
        } else {
            $thousand = smallNumberToText($triad, 0);
        }
        $thousand .= ' ' . inclineWord($triad, 'тысяча', 'тысячи', 'тысяч');
    }
    //Меньше тысячи
    if (count($numbers) > 0) {
        $triad = array_shift($numbers);
        $hundred = smallNumberToText($triad, 0);
        $hundred .= ' (' . $number . ') ';
        $hundred .= ' ' . inclineWord($triad, 'рубль', 'рубля', 'рублей');
    }
    //склеиваем и возвращаем
    $number = trim($millions . ' ' . $thousand . ' ' . $hundred);
    $number = preg_replace('/ +/', ' ', $number);
    return $number;
}

/* Вызовем функцию несколько раз */
$amount1 = mt_rand(1,99999999);
$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";