<?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, $word5) {
    /* DIY */

    $last2Digits = $number  % 100;
    $lastDigit = $number %10;

    if (($last2Digits > 5 && $last2Digits < 20) || ($lastDigit == 0 || ($lastDigit >= 5 && $lastDigit <= 9))) {
        return $word5;
    }

    if ($lastDigit >= 2 && $lastDigit <= 4) {
        return $word2;
    }

    return $word1;

}

/*
    Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
    если мы считаем число для мужского рода (один рубль),
    и 1 — для женского (одна тысяча)
*/
function smallNumberToText($number, $isFemale) {

    $spelling = [
        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 = [
        1   =>  'одна',        2   =>  'две'
    ];

    /* DIY */
    $digits = [];

    if ($number == 0) {
        return "ноль";
    }

    $ones = $number % 10;
    $tens = $number % 100;
    $hundreds = $number - $tens;

    if ($hundreds > 0) {
        $digits[] = $spelling[$hundreds];
    }

    if ($tens >= 10 && $tens < 20) {
        $digits[] = $spelling[$tens];
    }
    elseif ($tens >= 20) {
        $digits[] = $spelling[$tens - $ones];
    }

    if ($ones != 0) {
        if ($tens <= 10 || $tens>= 20) {
            if ($isFemale == 1 && ($ones == 1 || $ones == 2)) {
                $digits[] = $femaleSpelling[$ones];
            }
            else {
                $digits[] = $spelling[$ones];
            }
        }
    }
    $result = implode(" ", $digits);

    return $result;
}


function numberToText($number) {

    /* DIY */
    if ($number == 0)
        return "0 (0) рублей";

    $resultPieces = [];

    $ones = $number % 1000;
    $thousands = floor($number % 1000000 / 1000);
    $millions = floor($number % 1000000000 / 1000000);

    if ($millions > 0) {
        $resultPieces[] = smallNumberToText($millions,0);
        $resultPieces[] = inclineWord($millions,"миллион","миллиона","миллионов");
    }
    if ($thousands > 0) {
        $resultPieces[] = smallNumberToText($thousands,1);
        $resultPieces[] = inclineWord($thousands,"тысяча","тысячи","тысяч");
    }
    if ($ones > 0) {
        $resultPieces[] = smallNumberToText($ones,0);
        $resultPieces[] = " (".$number.") ".inclineWord($ones,"рубль","рубля","рублей");
    } else {
        $resultPieces[] = " (".$number.") рублей";
    }

    $text = implode(" ", $resultPieces);
    return $text;
}

// Вызовем функцию несколько раз
$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";

$testData = [999999999, 0, 1, 11012013, 7000008, 1002, 1000, 7000000, 1000001, 550];

foreach ($testData as $data){
    $text = numberToText($data);
    echo "На вашем счету {$text}\n";
}
