/*Во многих серьезных документах принято писать денежные суммы цифрами и прописью, вот так: «триста двадцать шесть (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 = 16010003 ;
$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+0LIiXTsKJHJ1YmxlcyA9IFsi0YDRg9Cx0LvRjCIsICLRgNGD0LHQu9GPIiwgItGA0YPQsdC70LXQuSJdOwokbnVtYmVyID0gMTYwMTAwMDM7CgokcmVzdWx0RXhwID0gIiI7Ly/Ql9C00LXRgdGMINGF0YDQsNC90LjRgtGB0Y8g0YDQtdC30YPQu9GM0YLQsNGCCgp3aGlsZSAoJG51bWJlciA+PSAxKSB7CiAgICAkaSA9IHN0cmxlbigoc3RyaW5nKSRudW1iZXIpOy8v0KHRh9C40YLQsNC10Lwg0LrQvtC70LjRh9C10YHRgtCy0L4g0YbQuNGE0YAgCiAgICAkZGVub21pbmF0aW9uID0gW107Ly/QkiDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4INC+0YIg0LrQvtC70LjRh9C10YHRgtCy0LAg0YbQuNGE0YAg0LfQtNC10YHRjCDQsdGD0LTRg9GCINGF0YDQsNC90LjRgtGB0Y8g0YLRi9GB0Y/Rh9C4LCDQvNC40LvQu9C40L7QvdGLINC40LvQuCDQvNC40LvQu9C40LDRgNC00YsKICAgIGlmICgkaSA+PSA0KSB7CiAgICAgICAgaWYgKCRpID49IDQgJiYgJGkgPCA3KSB7CiAgICAgICAgICAgICRkZW5vbWluYXRpb24gPSAkdGhvdXNhbmRzOwogICAgICAgIH0gZWxzZWlmICgkaSA+PSA3ICYmICRpIDwgMTApIHsKICAgICAgICAgICAgJGRlbm9taW5hdGlvbiA9ICRtaWxsaW9uczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZGVub21pbmF0aW9uID0gJGJpbGxpb25zOwogICAgICAgIH0KICAgICAgICBpZiAoJGkgJSAzID09IDApIHsKICAgICAgICAgICAgJHRocmVlRGlnaXRzID0gaW50dmFsKGZsb29yKCRudW1iZXIgLyBwb3coMTAsICRpIC0gMykpKTsvL9Cf0L7Qu9GD0YfQsNC10Lwg0L/QtdGA0LLRi9C1IDMg0YbQuNGE0YDRiwogICAgICAgICAgICAkbnVtYmVyID0gaW50dmFsKGZsb29yKCRudW1iZXIgJSBwb3coMTAsICRpIC0gMykpKTsvL9CY0Lcg0LjRgdGF0L7QtNC90L7Qs9C+INGH0LjQu9CwINGD0LHQuNGA0LDQtdC8INC/0LXRgNCy0YvQtSAzINGG0LjRhNGA0YsKICAgICAgICAgICAgJHJlc3VsdEV4cCAuPSB0b1dvcmRzKCR0aHJlZURpZ2l0cywgJG51bWJlcnMpOwogICAgICAgICAgICAkcmVzdWx0RXhwIC49ICIgIiAuIHdvcmQoJHRocmVlRGlnaXRzLCAkZGVub21pbmF0aW9uKTsKICAgICAgICB9IGVsc2VpZiAoJGkgJSAzID09IDIpIHsKICAgICAgICAgICAgJGZpcnN0VHdvRGlnaXQgPSBpbnR2YWwoZmxvb3IoJG51bWJlciAvIHBvdygxMCwgJGkgLSAyKSkpOy8v0J/QvtC70YPRh9Cw0LXQvCDQv9C10YDQstGL0LUgMiDRhtC40YTRgNGLCiAgICAgICAgICAgICRudW1iZXIgPSBpbnR2YWwoZmxvb3IoJG51bWJlciAlIHBvdygxMCwgJGkgLSAyKSkpOy8v0JjQtyDQuNGB0YXQvtC00L3QvtCz0L4g0YfQuNC70LAg0YPQsdC40YDQsNC10Lwg0L/QtdGA0LLRi9C1IDIg0YbQuNGE0YDRiwogICAgICAgICAgICAkcmVzdWx0RXhwIC49IHRvV29yZHMoJGZpcnN0VHdvRGlnaXQsICRudW1iZXJzKTsKICAgICAgICAgICAgJHJlc3VsdEV4cCAuPSAiICIgLiAgd29yZCgkZmlyc3RUd29EaWdpdCwgJGRlbm9taW5hdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGZpcnN0RGlnaXQgPSBpbnR2YWwoZmxvb3IoJG51bWJlciAvIHBvdygxMCwgJGkgLSAxKSkpOy8v0J/QvtC70YPRh9Cw0LXQvCDQv9C10YDQstGD0Y4g0YbQuNGE0YDRgwogICAgICAgICAgICAkbnVtYmVyID0gaW50dmFsKGZsb29yKCRudW1iZXIgJSAocG93KDEwLCAkaSAtIDEpKSkpOy8v0JjQtyDQuNGB0YXQvtC00L3QvtCz0L4g0YfQuNC70LAg0YPQsdC40YDQsNC10Lwg0L/QtdGA0LLRg9GOINGG0LjRhNGA0YMKICAgICAgICAgICAgJHJlc3VsdEV4cCAuPSB0b1dvcmRzKCRmaXJzdERpZ2l0LCAkbnVtYmVycyk7CiAgICAgICAgICAgICRyZXN1bHRFeHAgLj0gIiAiIC4gd29yZCgkZmlyc3REaWdpdCwgJGRlbm9taW5hdGlvbik7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAkcmVzdWx0RXhwIC49IHRvV29yZHMoJG51bWJlciwgJG51bWJlcnMpOwogICAgICAgICRyZXN1bHRFeHAgLj0gIiAiIC4gd29yZCgkbnVtYmVyLCAkcnVibGVzKTsKICAgICAgICBicmVhazsvL9CS0YvRhdC+0LTQuNC8INC40Lcg0YbQuNC60LvQsCwg0YIu0LouINGD0LbQtSDRgNCw0YHQv9C40YHQsNC70Lgg0LLRgdC1INGG0LjRhNGA0YsKICAgIH0KfQovL9CX0LDQvNC10L3Rj9C10Lwg0L3QsCDQttC10L3RgdC60LjQuSDRgNC+0LQKJHJlc3VsdEV4cCA9IHByZWdfcmVwbGFjZSgiL9C+0LTQuNC9XHPRgtGL0YHRj9GH0LAvdSIsICLQvtC00L3QsCDRgtGL0YHRj9GH0LAiLCAkcmVzdWx0RXhwKTsKJHJlc3VsdEV4cCA9IHByZWdfcmVwbGFjZSgiL9C00LLQsFxz0YLRi9GB0Y/Rh9C4L3UiLCAi0LTQstC1INGC0YvRgdGP0YfQuCIsICRyZXN1bHRFeHApOwplY2hvICJSZXN1bHQ6ICIgLiAkcmVzdWx0RXhwIC4gIlxuIjsKPz4=