/*Во многих серьезных документах принято писать денежные суммы цифрами и прописью, вот так: «триста двадцать шесть (326)
рублей», «две тысячи один (2001) рубль». Давай избавим людей от рутинной работы, и поручим склонение слов роботам и
языку PHP.
Дана сумма, находящаяся в банке на счету, в рублях. Вывести ее в текстовом виде вроде "шестнадцать миллионов десять
тысяч три (16010003) рубля".
*/
<?php
//mb_internal_encoding("utf-8");
function word( $number , $words ) //Возвращает "рубль", "рубля" или "рублей"
{
$number %= 10 ;
if ( $number == 1 ) {
return $words [ 0 ] ;
} elseif ( $number >= 2 && $number < 5 ) {
return $words [ 1 ] ;
} else {
return $words [ 2 ] ;
}
}
function toWords( $number , $numbers ) //Проверяет сотни, десятки и единицы и возвращает их, если они != 0
{
$resultExp = "" ;
$tensAndUnits = $number % 100 ;
$units = $tensAndUnits % 10 ;
if ( $hundred != 0 && $hundred > 99 ) {
$resultExp .= " " . $numbers [ $hundred ] ;
}
if ( $tensAndUnits != 0 ) {
if ( $tensAndUnits <= 20 && $tensAndUnits > 9 ) { //Если число в этом диапазоне, то нет необходимости писать единицы
$resultExp .= " " . $numbers [ $tensAndUnits ] ;
} else {
if ( $tens != 0 ) {
$resultExp .= " " . $numbers [ $tens ] ;
}
if ( $units != 0 ) {
$resultExp .= " " . $numbers [ $units ] ;
}
}
}
return $resultExp ;
}
//Числа прописью
$numbers = [ 1 => "один" , "два" , "три" , "четыре" , "пять" , "шесть" , "семь" , "восемь" , "девять" , "десять" ,
"одиннадцать" , "двенадцать" , "тринадцать" , "четырнадцать" , "пятнадцать" , "шестнадцать" , "семнадцать" , "восемнадцать" , "девятнадцать" ,
"двадцать" , 30 => "тридцать" , 40 => "сорок" , 50 => "пятьдесят" , 60 => "шестьдесят" , 70 => "семьдесят" , 80 => "восемьдесят" , 90 => "девяносто" ,
100 => "сто" , 200 => "двести" , 300 => "триста" , 400 => "четыреста" , 500 => "пятьсот" , 600 => "шесьтсот" , 700 => "семьсот" , 800 => "восемьсот" , 900 => "девятьсот" ] ;
//Первый элемент при 1, 2-ой при 2-4, 3 при остальных
$thousands = [ "тысяча" , "тысячи" , "тысяч" ] ;
$millions = [ "миллион" , "миллиона" , "миллионов" ] ;
$billions = [ "миллиард" , "миллиарда" , "миллиардов" ] ;
$rubles = [ "рубль" , "рубля" , "рублей" ] ;
$number = 999011012 ;
$resultExp = "" ; //Здесь хранится результат
while ( $number >= 1 ) {
$i = strlen ( ( string
) $number ) ; //Считаем количество цифр $denomination = [ ] ; //В зависимости от количества цифр здесь будут хранится тысячи, миллионы или миллиарды
if ( $i >= 4 ) {
if ( $i >= 4 && $i < 7 ) {
$denomination = $thousands ;
} elseif ( $i >= 7 && $i < 10 ) {
$denomination = $millions ;
} else {
$denomination = $billions ;
}
if ( $i % 3 == 0 ) {
$threeDigits = intval ( floor ( $number / pow ( 10 , $i - 3 ) ) ) ; //Получаем первые 3 цифры $number = intval ( floor ( $number % pow ( 10 , $i - 3 ) ) ) ; //Из исходного чила убираем первые 3 цифры $resultExp .= toWords( $threeDigits , $numbers ) ;
$resultExp .= " " . word( $threeDigits , $denomination ) ;
} elseif ( $i % 3 == 2 ) {
$firstTwoDigit = intval ( floor ( $number / pow ( 10 , $i - 2 ) ) ) ; //Получаем первые 2 цифры $number = intval ( floor ( $number % pow ( 10 , $i - 2 ) ) ) ; //Из исходного чила убираем первые 2 цифры $resultExp .= toWords( $firstTwoDigit , $numbers ) ;
$resultExp .= " " . word( $firstTwoDigit , $denomination ) ;
} else {
$firstDigit = intval ( floor ( $number / pow ( 10 , $i - 1 ) ) ) ; //Получаем первую цифру $number = intval ( floor ( $number % ( pow ( 10 , $i - 1 ) ) ) ) ; //Из исходного чила убираем первую цифру $resultExp .= toWords( $firstDigit , $numbers ) ;
$resultExp .= " " . word( $firstDigit , $denomination ) ;
}
} else {
$resultExp .= toWords( $number , $numbers ) ;
$resultExp .= " " . word( $number , $rubles ) ;
break ; //Выходим из цикла, т.к. уже расписали все цифры
}
}
//Заменяем на женский род
$resultExp = preg_replace ( "/один\sтысяча/u" , "одна тысяча" , $resultExp ) ; $resultExp = preg_replace ( "/два\sтысячи/u" , "две тысячи" , $resultExp ) ; echo "Result: " . $resultExp . "\n " ;
?>
LyrQktC+INC80L3QvtCz0LjRhSDRgdC10YDRjNC10LfQvdGL0YUg0LTQvtC60YPQvNC10L3RgtCw0YUg0L/RgNC40L3Rj9GC0L4g0L/QuNGB0LDRgtGMINC00LXQvdC10LbQvdGL0LUg0YHRg9C80LzRiyDRhtC40YTRgNCw0LzQuCDQuCDQv9GA0L7Qv9C40YHRjNGOLCDQstC+0YIg0YLQsNC6OiDCq9GC0YDQuNGB0YLQsCDQtNCy0LDQtNGG0LDRgtGMINGI0LXRgdGC0YwgKDMyNikK0YDRg9Cx0LvQtdC5wrssIMKr0LTQstC1INGC0YvRgdGP0YfQuCDQvtC00LjQvSAoMjAwMSkg0YDRg9Cx0LvRjMK7LiDQlNCw0LLQsNC5INC40LfQsdCw0LLQuNC8INC70Y7QtNC10Lkg0L7RgiDRgNGD0YLQuNC90L3QvtC5INGA0LDQsdC+0YLRiywg0Lgg0L/QvtGA0YPRh9C40Lwg0YHQutC70L7QvdC10L3QuNC1INGB0LvQvtCyINGA0L7QsdC+0YLQsNC8INC4CtGP0LfRi9C60YMgUEhQLgoK0JTQsNC90LAg0YHRg9C80LzQsCwg0L3QsNGF0L7QtNGP0YnQsNGP0YHRjyDQsiDQsdCw0L3QutC1INC90LAg0YHRh9C10YLRgywg0LIg0YDRg9Cx0LvRj9GFLiDQktGL0LLQtdGB0YLQuCDQtdC1INCyINGC0LXQutGB0YLQvtCy0L7QvCDQstC40LTQtSDQstGA0L7QtNC1ICLRiNC10YHRgtC90LDQtNGG0LDRgtGMINC80LjQu9C70LjQvtC90L7QsiDQtNC10YHRj9GC0YwK0YLRi9GB0Y/RhyDRgtGA0LggKDE2MDEwMDAzKSDRgNGD0LHQu9GPIi4KKi8KPD9waHAKLy9tYl9pbnRlcm5hbF9lbmNvZGluZygidXRmLTgiKTsKZXJyb3JfcmVwb3J0aW5nKC0xKTsKZnVuY3Rpb24gd29yZCgkbnVtYmVyLCAkd29yZHMpIC8v0JLQvtC30LLRgNCw0YnQsNC10YIgItGA0YPQsdC70YwiLCAi0YDRg9Cx0LvRjyIg0LjQu9C4ICLRgNGD0LHQu9C10LkiCnsKICAgICRudW1iZXIgJT0gMTA7CiAgICBpZiAoJG51bWJlciA9PSAxKSB7CiAgICAgICAgcmV0dXJuICR3b3Jkc1swXTsKICAgIH0gZWxzZWlmICgkbnVtYmVyID49IDIgJiYgJG51bWJlciA8IDUpIHsKICAgICAgICByZXR1cm4gJHdvcmRzWzFdOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gJHdvcmRzWzJdOwogICAgfQp9CgpmdW5jdGlvbiB0b1dvcmRzKCRudW1iZXIsICRudW1iZXJzKSAvL9Cf0YDQvtCy0LXRgNGP0LXRgiDRgdC+0YLQvdC4LCDQtNC10YHRj9GC0LrQuCDQuCDQtdC00LjQvdC40YbRiyDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQuNGFLCDQtdGB0LvQuCDQvtC90LggIT0gMAp7CiAgICAkcmVzdWx0RXhwID0gIiI7CiAgICAkaHVuZHJlZCA9IGludHZhbChmbG9vcigkbnVtYmVyIC8gMTAwKSAqIDEwMCk7CiAgICAkdGVuc0FuZFVuaXRzID0gJG51bWJlciAlIDEwMDsKICAgICR1bml0cyA9ICR0ZW5zQW5kVW5pdHMgJSAxMDsKICAgIGlmICgkaHVuZHJlZCAhPSAwICYmICRodW5kcmVkID4gOTkpIHsKICAgICAgICAkcmVzdWx0RXhwIC49ICIgIiAuICRudW1iZXJzWyRodW5kcmVkXTsKICAgIH0KICAgIGlmICgkdGVuc0FuZFVuaXRzICE9IDApIHsKICAgICAgICBpZiAoJHRlbnNBbmRVbml0cyA8PSAyMCAmJiAkdGVuc0FuZFVuaXRzID4gOSkgey8v0JXRgdC70Lgg0YfQuNGB0LvQviDQsiDRjdGC0L7QvCDQtNC40LDQv9Cw0LfQvtC90LUsINGC0L4g0L3QtdGCINC90LXQvtCx0YXQvtC00LjQvNC+0YHRgtC4INC/0LjRgdCw0YLRjCDQtdC00LjQvdC40YbRiwogICAgICAgICAgICAkcmVzdWx0RXhwIC49ICIgIiAuICRudW1iZXJzWyR0ZW5zQW5kVW5pdHNdOwogICAgICAgIH0gZWxzZXsgCiAgICAgICAgICAgICR0ZW5zID0gaW50dmFsKGZsb29yKCR0ZW5zQW5kVW5pdHMgLyAxMCkpICogMTA7CiAgICAgICAgICAgIGlmKCR0ZW5zICE9IDApewogICAgICAgICAgICAgICAgJHJlc3VsdEV4cCAuPSAiICIgLiAkbnVtYmVyc1skdGVuc107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR1bml0cyAhPSAwKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0RXhwIC49ICIgIiAuICRudW1iZXJzWyR1bml0c107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdEV4cDsKfQovL9Cn0LjRgdC70LAg0L/RgNC+0L/QuNGB0YzRjgokbnVtYmVycyA9IFsxID0+ICLQvtC00LjQvSIsICLQtNCy0LAiLCAi0YLRgNC4IiwgItGH0LXRgtGL0YDQtSIsICLQv9GP0YLRjCIsICLRiNC10YHRgtGMIiwgItGB0LXQvNGMIiwgItCy0L7RgdC10LzRjCIsICLQtNC10LLRj9GC0YwiLCAi0LTQtdGB0Y/RgtGMIiwKICAgICLQvtC00LjQvdC90LDQtNGG0LDRgtGMIiwgItC00LLQtdC90LDQtNGG0LDRgtGMIiwgItGC0YDQuNC90LDQtNGG0LDRgtGMIiwgItGH0LXRgtGL0YDQvdCw0LTRhtCw0YLRjCIsICLQv9GP0YLQvdCw0LTRhtCw0YLRjCIsICLRiNC10YHRgtC90LDQtNGG0LDRgtGMIiwgItGB0LXQvNC90LDQtNGG0LDRgtGMIiwgItCy0L7RgdC10LzQvdCw0LTRhtCw0YLRjCIsICLQtNC10LLRj9GC0L3QsNC00YbQsNGC0YwiLAogICAgItC00LLQsNC00YbQsNGC0YwiLCAzMCA9PiAi0YLRgNC40LTRhtCw0YLRjCIsIDQwID0+ICLRgdC+0YDQvtC6IiwgNTAgPT4gItC/0Y/RgtGM0LTQtdGB0Y/RgiIsIDYwID0+ICLRiNC10YHRgtGM0LTQtdGB0Y/RgiIsIDcwID0+ICLRgdC10LzRjNC00LXRgdGP0YIiLCA4MCA9PiAi0LLQvtGB0LXQvNGM0LTQtdGB0Y/RgiIsIDkwID0+ICLQtNC10LLRj9C90L7RgdGC0L4iLAogICAgMTAwID0+ICLRgdGC0L4iLCAyMDAgPT4gItC00LLQtdGB0YLQuCIsIDMwMCA9PiAi0YLRgNC40YHRgtCwIiwgNDAwID0+ICLRh9C10YLRi9GA0LXRgdGC0LAiLCA1MDAgPT4gItC/0Y/RgtGM0YHQvtGCIiwgNjAwID0+ICLRiNC10YHRjNGC0YHQvtGCIiwgNzAwID0+ICLRgdC10LzRjNGB0L7RgiIsIDgwMCA9PiAi0LLQvtGB0LXQvNGM0YHQvtGCIiwgOTAwID0+ICLQtNC10LLRj9GC0YzRgdC+0YIiXTsKCi8v0J/QtdGA0LLRi9C5INGN0LvQtdC80LXQvdGCINC/0YDQuCAxLCAyLdC+0Lkg0L/RgNC4IDItNCwgMyDQv9GA0Lgg0L7RgdGC0LDQu9GM0L3Ri9GFCiR0aG91c2FuZHMgPSBbItGC0YvRgdGP0YfQsCIsICLRgtGL0YHRj9GH0LgiLCAi0YLRi9GB0Y/RhyJdOwokbWlsbGlvbnMgPSBbItC80LjQu9C70LjQvtC9IiwgItC80LjQu9C70LjQvtC90LAiLCAi0LzQuNC70LvQuNC+0L3QvtCyIl07CiRiaWxsaW9ucyA9IFsi0LzQuNC70LvQuNCw0YDQtCIsICLQvNC40LvQu9C40LDRgNC00LAiLCAi0LzQuNC70LvQuNCw0YDQtNC+0LIiXTsKJHJ1YmxlcyA9IFsi0YDRg9Cx0LvRjCIsICLRgNGD0LHQu9GPIiwgItGA0YPQsdC70LXQuSJdOwokbnVtYmVyID0gOTk5MDExMDEyOwoKJHJlc3VsdEV4cCA9ICIiOy8v0JfQtNC10YHRjCDRhdGA0LDQvdC40YLRgdGPINGA0LXQt9GD0LvRjNGC0LDRggoKd2hpbGUgKCRudW1iZXIgPj0gMSkgewogICAgJGkgPSBzdHJsZW4oKHN0cmluZykkbnVtYmVyKTsvL9Ch0YfQuNGC0LDQtdC8INC60L7Qu9C40YfQtdGB0YLQstC+INGG0LjRhNGAIAogICAgJGRlbm9taW5hdGlvbiA9IFtdOy8v0JIg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQvtGCINC60L7Qu9C40YfQtdGB0YLQstCwINGG0LjRhNGAINC30LTQtdGB0Ywg0LHRg9C00YPRgiDRhdGA0LDQvdC40YLRgdGPINGC0YvRgdGP0YfQuCwg0LzQuNC70LvQuNC+0L3RiyDQuNC70Lgg0LzQuNC70LvQuNCw0YDQtNGLCiAgICBpZiAoJGkgPj0gNCkgewogICAgICAgIGlmICgkaSA+PSA0ICYmICRpIDwgNykgewogICAgICAgICAgICAkZGVub21pbmF0aW9uID0gJHRob3VzYW5kczsKICAgICAgICB9IGVsc2VpZiAoJGkgPj0gNyAmJiAkaSA8IDEwKSB7CiAgICAgICAgICAgICRkZW5vbWluYXRpb24gPSAkbWlsbGlvbnM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGRlbm9taW5hdGlvbiA9ICRiaWxsaW9uczsKICAgICAgICB9CiAgICAgICAgaWYgKCRpICUgMyA9PSAwKSB7CiAgICAgICAgICAgICR0aHJlZURpZ2l0cyA9IGludHZhbChmbG9vcigkbnVtYmVyIC8gcG93KDEwLCAkaSAtIDMpKSk7Ly/Qn9C+0LvRg9GH0LDQtdC8INC/0LXRgNCy0YvQtSAzINGG0LjRhNGA0YsKICAgICAgICAgICAgJG51bWJlciA9IGludHZhbChmbG9vcigkbnVtYmVyICUgcG93KDEwLCAkaSAtIDMpKSk7Ly/QmNC3INC40YHRhdC+0LTQvdC+0LPQviDRh9C40LvQsCDRg9Cx0LjRgNCw0LXQvCDQv9C10YDQstGL0LUgMyDRhtC40YTRgNGLCiAgICAgICAgICAgICRyZXN1bHRFeHAgLj0gdG9Xb3JkcygkdGhyZWVEaWdpdHMsICRudW1iZXJzKTsKICAgICAgICAgICAgJHJlc3VsdEV4cCAuPSAiICIgLiB3b3JkKCR0aHJlZURpZ2l0cywgJGRlbm9taW5hdGlvbik7CiAgICAgICAgfSBlbHNlaWYgKCRpICUgMyA9PSAyKSB7CiAgICAgICAgICAgICRmaXJzdFR3b0RpZ2l0ID0gaW50dmFsKGZsb29yKCRudW1iZXIgLyBwb3coMTAsICRpIC0gMikpKTsvL9Cf0L7Qu9GD0YfQsNC10Lwg0L/QtdGA0LLRi9C1IDIg0YbQuNGE0YDRiwogICAgICAgICAgICAkbnVtYmVyID0gaW50dmFsKGZsb29yKCRudW1iZXIgJSBwb3coMTAsICRpIC0gMikpKTsvL9CY0Lcg0LjRgdGF0L7QtNC90L7Qs9C+INGH0LjQu9CwINGD0LHQuNGA0LDQtdC8INC/0LXRgNCy0YvQtSAyINGG0LjRhNGA0YsKICAgICAgICAgICAgJHJlc3VsdEV4cCAuPSB0b1dvcmRzKCRmaXJzdFR3b0RpZ2l0LCAkbnVtYmVycyk7CiAgICAgICAgICAgICRyZXN1bHRFeHAgLj0gIiAiIC4gIHdvcmQoJGZpcnN0VHdvRGlnaXQsICRkZW5vbWluYXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRmaXJzdERpZ2l0ID0gaW50dmFsKGZsb29yKCRudW1iZXIgLyBwb3coMTAsICRpIC0gMSkpKTsvL9Cf0L7Qu9GD0YfQsNC10Lwg0L/QtdGA0LLRg9GOINGG0LjRhNGA0YMKICAgICAgICAgICAgJG51bWJlciA9IGludHZhbChmbG9vcigkbnVtYmVyICUgKHBvdygxMCwgJGkgLSAxKSkpKTsvL9CY0Lcg0LjRgdGF0L7QtNC90L7Qs9C+INGH0LjQu9CwINGD0LHQuNGA0LDQtdC8INC/0LXRgNCy0YPRjiDRhtC40YTRgNGDCiAgICAgICAgICAgICRyZXN1bHRFeHAgLj0gdG9Xb3JkcygkZmlyc3REaWdpdCwgJG51bWJlcnMpOwogICAgICAgICAgICAkcmVzdWx0RXhwIC49ICIgIiAuIHdvcmQoJGZpcnN0RGlnaXQsICRkZW5vbWluYXRpb24pOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgJHJlc3VsdEV4cCAuPSB0b1dvcmRzKCRudW1iZXIsICRudW1iZXJzKTsKICAgICAgICAkcmVzdWx0RXhwIC49ICIgIiAuIHdvcmQoJG51bWJlciwgJHJ1Ymxlcyk7CiAgICAgICAgYnJlYWs7Ly/QktGL0YXQvtC00LjQvCDQuNC3INGG0LjQutC70LAsINGCLtC6LiDRg9C20LUg0YDQsNGB0L/QuNGB0LDQu9C4INCy0YHQtSDRhtC40YTRgNGLCiAgICB9Cn0KLy/Ql9Cw0LzQtdC90Y/QtdC8INC90LAg0LbQtdC90YHQutC40Lkg0YDQvtC0CiRyZXN1bHRFeHAgPSBwcmVnX3JlcGxhY2UoIi/QvtC00LjQvVxz0YLRi9GB0Y/Rh9CwL3UiLCAi0L7QtNC90LAg0YLRi9GB0Y/Rh9CwIiwgJHJlc3VsdEV4cCk7CiRyZXN1bHRFeHAgPSBwcmVnX3JlcGxhY2UoIi/QtNCy0LBcc9GC0YvRgdGP0YfQuC91IiwgItC00LLQtSDRgtGL0YHRj9GH0LgiLCAkcmVzdWx0RXhwKTsKZWNobyAiUmVzdWx0OiAiIC4gJHJlc3VsdEV4cCAuICJcbiI7Cj8+