/*Во многих серьезных документах принято писать денежные суммы цифрами и прописью, вот так: «триста двадцать шесть (326)
рублей», «две тысячи один (2001) рубль». Давай избавим людей от рутинной работы, и поручим склонение слов роботам и
языку PHP.
Дана сумма, находящаяся в банке на счету, в рублях. Вывести ее в текстовом виде вроде "шестнадцать миллионов десять
тысяч три (16010003) рубля".
*/
<?php
//mb_internal_encoding("utf-8");
function getDigits( int $number , int $i ) { //Возвращает первые цифры для переданного числа
}
function getRemainder( int $number , int $i ) { //Возвращает остаток числа
}
function word
( int
$number = 0 , array $words ) //Возвращает "рубль", "рубля" или "рублей" {
if ( $number % 10 == 1 && $number != 11 ) {
return $words [ 0 ] ;
} elseif ( $number % 10 >= 2 && $number % 10 < 5 && ( $number % 100 > 15 || $number % 100 < 5 ) ) {
return $words [ 1 ] ;
} else {
return $words [ 2 ] ;
}
}
function digitsToWords
( int
$number , array $numbers , bool
$isFemale ) { //Проверяет сотни, десятки и единицы и возвращает их, если они != 0 $femNumbers = [ 1 => "одна" , "две" ] ;
$resultExp = [ ] ;
$tensAndUnits = $number % 100 ;
$units = $tensAndUnits % 10 ;
if ( $hundred >= 100 ) {
$resultExp [ ] = $numbers [ $hundred ] ;
}
if ( $tensAndUnits != 0 ) {
if ( $tensAndUnits > 9 && $tensAndUnits <= 20 ) { //Если число в этом диапазоне, то нет необходимости писать единицы
$resultExp [ ] = $numbers [ $tensAndUnits ] ;
} else {
if ( $tens != 0 ) {
$resultExp [ ] = $numbers [ $tens ] ;
}
if ( $units != 0 ) {
if ( $isFemale && ( $units == 1 || $units == 2 ) ) { //На жр нужно заменять только 1 или 2, и только перед словом тысяча(и)
$resultExp [ ] = $femNumbers [ $units ] ;
} else {
$resultExp [ ] = $numbers [ $units ] ;
}
}
}
}
}
$numbers = [ "ноль" , "один" , "два" , "три" , "четыре" , "пять" , "шесть" , "семь" , "восемь" , "девять" , "десять" ,
"одиннадцать" , "двенадцать" , "тринадцать" , "четырнадцать" , "пятнадцать" , "шестнадцать" , "семнадцать" , "восемнадцать" , "девятнадцать" ,
"двадцать" , 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 = 999001012 ;
$resultExp = [ ] ; //Здесь хранится результат
if ( $number != 0 ) {
while ( $number >= 1 ) {
$isFemale = false ; //Женский род
$i = intval ( log10 ( abs ( $number ) ) ) + 1 ; //Количество цифр = log10(n) + 1; $denomination = [ ] ; //В зависимости от количества цифр здесь будут хранится тысячи, миллионы или миллиарды
if ( $i >= 4 ) {
if ( $i >= 4 && $i < 7 ) {
$denomination = $thousands ;
$isFemale = true ;
} elseif ( $i >= 7 && $i < 10 ) {
$denomination = $millions ;
} else {
$denomination = $billions ;
}
if ( $i % 3 == 0 ) {
$threeDigits = getDigits( $number , $i - 3 ) ;
$number = getRemainder( $number , $i - 3 ) ;
$resultExp [ ] = digitsToWords( $threeDigits , $numbers , $isFemale ) ;
$resultExp [ ] = word( $threeDigits , $denomination ) ;
} elseif ( $i % 3 == 2 ) {
$firstTwoDigit = getDigits( $number , $i - 2 ) ;
$number = getRemainder( $number , $i - 2 ) ;
$resultExp [ ] = digitsToWords( $firstTwoDigit , $numbers , $isFemale ) ;
$resultExp [ ] = word( $firstTwoDigit , $denomination ) ;
} else {
$firstDigit = getDigits( $number , $i - 1 ) ;
$number = getRemainder( $number , $i - 1 ) ;
//echo $number . "\n";
$resultExp [ ] = digitsToWords( $firstDigit , $numbers , $isFemale ) ;
$resultExp [ ] = word( $firstDigit , $denomination ) ;
}
} else {
$resultExp [ ] = digitsToWords( $number , $numbers , false ) ;
$resultExp [ ] = word( $number , $rubles ) ;
break ; //Выходим из цикла, т.к. уже расписали все цифры
}
}
} else {
$resultExp [ ] = $numbers [ $number ] ;
$resultExp [ ] = word( $number , $rubles ) ;
}
echo "Result: " . implode ( " " , $resultExp ) . "\n " ; ?>
LyrQktC+INC80L3QvtCz0LjRhSDRgdC10YDRjNC10LfQvdGL0YUg0LTQvtC60YPQvNC10L3RgtCw0YUg0L/RgNC40L3Rj9GC0L4g0L/QuNGB0LDRgtGMINC00LXQvdC10LbQvdGL0LUg0YHRg9C80LzRiyDRhtC40YTRgNCw0LzQuCDQuCDQv9GA0L7Qv9C40YHRjNGOLCDQstC+0YIg0YLQsNC6OiDCq9GC0YDQuNGB0YLQsCDQtNCy0LDQtNGG0LDRgtGMINGI0LXRgdGC0YwgKDMyNikK0YDRg9Cx0LvQtdC5wrssIMKr0LTQstC1INGC0YvRgdGP0YfQuCDQvtC00LjQvSAoMjAwMSkg0YDRg9Cx0LvRjMK7LiDQlNCw0LLQsNC5INC40LfQsdCw0LLQuNC8INC70Y7QtNC10Lkg0L7RgiDRgNGD0YLQuNC90L3QvtC5INGA0LDQsdC+0YLRiywg0Lgg0L/QvtGA0YPRh9C40Lwg0YHQutC70L7QvdC10L3QuNC1INGB0LvQvtCyINGA0L7QsdC+0YLQsNC8INC4CtGP0LfRi9C60YMgUEhQLgoK0JTQsNC90LAg0YHRg9C80LzQsCwg0L3QsNGF0L7QtNGP0YnQsNGP0YHRjyDQsiDQsdCw0L3QutC1INC90LAg0YHRh9C10YLRgywg0LIg0YDRg9Cx0LvRj9GFLiDQktGL0LLQtdGB0YLQuCDQtdC1INCyINGC0LXQutGB0YLQvtCy0L7QvCDQstC40LTQtSDQstGA0L7QtNC1ICLRiNC10YHRgtC90LDQtNGG0LDRgtGMINC80LjQu9C70LjQvtC90L7QsiDQtNC10YHRj9GC0YwK0YLRi9GB0Y/RhyDRgtGA0LggKDE2MDEwMDAzKSDRgNGD0LHQu9GPIi4KKi8KPD9waHAKLy9tYl9pbnRlcm5hbF9lbmNvZGluZygidXRmLTgiKTsKZXJyb3JfcmVwb3J0aW5nKC0xKTsKZnVuY3Rpb24gZ2V0RGlnaXRzKGludCAkbnVtYmVyLCBpbnQgJGkpey8v0JLQvtC30LLRgNCw0YnQsNC10YIg0L/QtdGA0LLRi9C1INGG0LjRhNGA0Ysg0LTQu9GPINC/0LXRgNC10LTQsNC90L3QvtCz0L4g0YfQuNGB0LvQsAogICAgcmV0dXJuIGludHZhbChmbG9vcigkbnVtYmVyIC8gcG93KDEwLCAkaSkpKTsKfQpmdW5jdGlvbiBnZXRSZW1haW5kZXIoaW50ICRudW1iZXIsIGludCAkaSl7Ly/QktC+0LfQstGA0LDRidCw0LXRgiDQvtGB0YLQsNGC0L7QuiDRh9C40YHQu9CwCiAgICByZXR1cm4gaW50dmFsKGZsb29yKCRudW1iZXIgJSBwb3coMTAsICRpKSkpOwp9CmZ1bmN0aW9uIHdvcmQoaW50ICRudW1iZXIgPSAwLCBhcnJheSAkd29yZHMpIC8v0JLQvtC30LLRgNCw0YnQsNC10YIgItGA0YPQsdC70YwiLCAi0YDRg9Cx0LvRjyIg0LjQu9C4ICLRgNGD0LHQu9C10LkiCnsKICAgIGlmICgkbnVtYmVyICUgMTAgPT0gMSAmJiAkbnVtYmVyICE9IDExKSB7CiAgICAgICAgcmV0dXJuICR3b3Jkc1swXTsKICAgIH0gZWxzZWlmICgkbnVtYmVyICUgMTAgPj0gMiAmJiAkbnVtYmVyICUgMTAgPCA1ICYmICgkbnVtYmVyICUgMTAwID4gMTUgfHwgJG51bWJlciAlIDEwMCA8IDUpKSB7CiAgICAgICAgcmV0dXJuICR3b3Jkc1sxXTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR3b3Jkc1syXTsKICAgIH0KfQoKZnVuY3Rpb24gZGlnaXRzVG9Xb3JkcyhpbnQgJG51bWJlciwgYXJyYXkgJG51bWJlcnMsIGJvb2wgJGlzRmVtYWxlKXsvL9Cf0YDQvtCy0LXRgNGP0LXRgiDRgdC+0YLQvdC4LCDQtNC10YHRj9GC0LrQuCDQuCDQtdC00LjQvdC40YbRiyDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQuNGFLCDQtdGB0LvQuCDQvtC90LggIT0gMAogICAgJGZlbU51bWJlcnMgPSBbMSA9PiAi0L7QtNC90LAiLCAi0LTQstC1Il07CiAgICAkcmVzdWx0RXhwID0gW107CiAgICAkaHVuZHJlZCA9IGludHZhbChmbG9vcigkbnVtYmVyIC8gMTAwKSAqIDEwMCk7CiAgICAkdGVuc0FuZFVuaXRzID0gJG51bWJlciAlIDEwMDsKICAgICR1bml0cyA9ICR0ZW5zQW5kVW5pdHMgJSAxMDsKICAgIGlmICgkaHVuZHJlZCA+PSAxMDApIHsKICAgICAgICAkcmVzdWx0RXhwW10gPSAkbnVtYmVyc1skaHVuZHJlZF07CiAgICB9CiAgICBpZiAoJHRlbnNBbmRVbml0cyAhPSAwKSB7CiAgICAgICAgaWYgKCR0ZW5zQW5kVW5pdHMgPiA5ICYmICR0ZW5zQW5kVW5pdHMgPD0gMjApIHsvL9CV0YHQu9C4INGH0LjRgdC70L4g0LIg0Y3RgtC+0Lwg0LTQuNCw0L/QsNC30L7QvdC1LCDRgtC+INC90LXRgiDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLQuCDQv9C40YHQsNGC0Ywg0LXQtNC40L3QuNGG0YsKICAgICAgICAgICAgJHJlc3VsdEV4cFtdID0gJG51bWJlcnNbJHRlbnNBbmRVbml0c107CiAgICAgICAgfSBlbHNlewogICAgICAgICAgICAkdGVucyA9IGludHZhbChmbG9vcigkdGVuc0FuZFVuaXRzIC8gMTApKSAqIDEwOwogICAgICAgICAgICBpZigkdGVucyAhPSAwKXsKICAgICAgICAgICAgICAgICRyZXN1bHRFeHBbXSA9ICRudW1iZXJzWyR0ZW5zXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHVuaXRzICE9IDApIHsKICAgICAgICAgICAgICAgIGlmKCRpc0ZlbWFsZSAmJiAoJHVuaXRzID09IDEgfHwgJHVuaXRzID09IDIpKXsvL9Cd0LAg0LbRgCDQvdGD0LbQvdC+INC30LDQvNC10L3Rj9GC0Ywg0YLQvtC70YzQutC+IDEg0LjQu9C4IDIsINC4INGC0L7Qu9GM0LrQviDQv9C10YDQtdC0INGB0LvQvtCy0L7QvCDRgtGL0YHRj9GH0LAo0LgpCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdEV4cFtdID0gJGZlbU51bWJlcnNbJHVuaXRzXTsKICAgICAgICAgICAgICAgIH0gICBlbHNlewogICAgICAgICAgICAgICAgICAgICRyZXN1bHRFeHBbXSA9ICRudW1iZXJzWyR1bml0c107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaW1wbG9kZSgiICIsICRyZXN1bHRFeHApOwp9CgokbnVtYmVycyA9IFsi0L3QvtC70YwiLCAi0L7QtNC40L0iLCAi0LTQstCwIiwgItGC0YDQuCIsICLRh9C10YLRi9GA0LUiLCAi0L/Rj9GC0YwiLCAi0YjQtdGB0YLRjCIsICLRgdC10LzRjCIsICLQstC+0YHQtdC80YwiLCAi0LTQtdCy0Y/RgtGMIiwgItC00LXRgdGP0YLRjCIsCiAgICAi0L7QtNC40L3QvdCw0LTRhtCw0YLRjCIsICLQtNCy0LXQvdCw0LTRhtCw0YLRjCIsICLRgtGA0LjQvdCw0LTRhtCw0YLRjCIsICLRh9C10YLRi9GA0L3QsNC00YbQsNGC0YwiLCAi0L/Rj9GC0L3QsNC00YbQsNGC0YwiLCAi0YjQtdGB0YLQvdCw0LTRhtCw0YLRjCIsICLRgdC10LzQvdCw0LTRhtCw0YLRjCIsICLQstC+0YHQtdC80L3QsNC00YbQsNGC0YwiLCAi0LTQtdCy0Y/RgtC90LDQtNGG0LDRgtGMIiwKICAgICLQtNCy0LDQtNGG0LDRgtGMIiwgMzAgPT4gItGC0YDQuNC00YbQsNGC0YwiLCA0MCA9PiAi0YHQvtGA0L7QuiIsIDUwID0+ICLQv9GP0YLRjNC00LXRgdGP0YIiLCA2MCA9PiAi0YjQtdGB0YLRjNC00LXRgdGP0YIiLCA3MCA9PiAi0YHQtdC80YzQtNC10YHRj9GCIiwgODAgPT4gItCy0L7RgdC10LzRjNC00LXRgdGP0YIiLCA5MCA9PiAi0LTQtdCy0Y/QvdC+0YHRgtC+IiwKICAgIDEwMCA9PiAi0YHRgtC+IiwgMjAwID0+ICLQtNCy0LXRgdGC0LgiLCAzMDAgPT4gItGC0YDQuNGB0YLQsCIsIDQwMCA9PiAi0YfQtdGC0YvRgNC10YHRgtCwIiwgNTAwID0+ICLQv9GP0YLRjNGB0L7RgiIsIDYwMCA9PiAi0YjQtdGB0YzRgtGB0L7RgiIsIDcwMCA9PiAi0YHQtdC80YzRgdC+0YIiLCA4MDAgPT4gItCy0L7RgdC10LzRjNGB0L7RgiIsIDkwMCA9PiAi0LTQtdCy0Y/RgtGM0YHQvtGCIl07CgovL9Cf0LXRgNCy0YvQuSDRjdC70LXQvNC10L3RgiDQv9GA0LggMSwgMi3QvtC5INC/0YDQuCAyLTQsIDMg0L/RgNC4INC+0YHRgtCw0LvRjNC90YvRhQokdGhvdXNhbmRzID0gWyLRgtGL0YHRj9GH0LAiLCAi0YLRi9GB0Y/Rh9C4IiwgItGC0YvRgdGP0YciXTsKJG1pbGxpb25zID0gWyLQvNC40LvQu9C40L7QvSIsICLQvNC40LvQu9C40L7QvdCwIiwgItC80LjQu9C70LjQvtC90L7QsiJdOwokYmlsbGlvbnMgPSBbItC80LjQu9C70LjQsNGA0LQiLCAi0LzQuNC70LvQuNCw0YDQtNCwIiwgItC80LjQu9C70LjQsNGA0LTQvtCyIl07CiRydWJsZXMgPSBbItGA0YPQsdC70YwiLCAi0YDRg9Cx0LvRjyIsICLRgNGD0LHQu9C10LkiXTsKJG51bWJlciA9IDk5OTAwMTAxMjsKJHJlc3VsdEV4cCA9IFtdOy8v0JfQtNC10YHRjCDRhdGA0LDQvdC40YLRgdGPINGA0LXQt9GD0LvRjNGC0LDRggppZigkbnVtYmVyICE9IDApewogICAgd2hpbGUgKCRudW1iZXIgPj0gMSkgewogICAgICAgICRpc0ZlbWFsZSA9IGZhbHNlOy8v0JbQtdC90YHQutC40Lkg0YDQvtC0CiAgICAgICAgJGkgPSBpbnR2YWwobG9nMTAoYWJzKCRudW1iZXIpKSkgKyAxOy8v0JrQvtC70LjRh9C10YHRgtCy0L4g0YbQuNGE0YAgPSBsb2cxMChuKSArIDE7CiAgICAgICAgJGRlbm9taW5hdGlvbiA9IFtdOy8v0JIg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQvtGCINC60L7Qu9C40YfQtdGB0YLQstCwINGG0LjRhNGAINC30LTQtdGB0Ywg0LHRg9C00YPRgiDRhdGA0LDQvdC40YLRgdGPINGC0YvRgdGP0YfQuCwg0LzQuNC70LvQuNC+0L3RiyDQuNC70Lgg0LzQuNC70LvQuNCw0YDQtNGLCiAgICAgICAgaWYgKCRpID49IDQpIHsKICAgICAgICAgICAgaWYgKCRpID49IDQgJiYgJGkgPCA3KSB7CiAgICAgICAgICAgICAgICAkZGVub21pbmF0aW9uID0gJHRob3VzYW5kczsKICAgICAgICAgICAgICAgICRpc0ZlbWFsZSA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaSA+PSA3ICYmICRpIDwgMTApIHsKICAgICAgICAgICAgICAgICRkZW5vbWluYXRpb24gPSAkbWlsbGlvbnM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZGVub21pbmF0aW9uID0gJGJpbGxpb25zOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRudW1iZXIgPSBpbnR2YWwoJG51bWJlcik7CiAgICAgICAgICAgIGlmICgkaSAlIDMgPT0gMCkgewogICAgICAgICAgICAgICAgJHRocmVlRGlnaXRzID0gZ2V0RGlnaXRzKCRudW1iZXIsICRpIC0gMyk7CiAgICAgICAgICAgICAgICAkbnVtYmVyID0gZ2V0UmVtYWluZGVyKCRudW1iZXIsICRpIC0gMyk7CiAgICAgICAgICAgICAgICAkcmVzdWx0RXhwW10gPSBkaWdpdHNUb1dvcmRzKCR0aHJlZURpZ2l0cywgJG51bWJlcnMsICRpc0ZlbWFsZSk7CiAgICAgICAgICAgICAgICAkcmVzdWx0RXhwW10gPSB3b3JkKCR0aHJlZURpZ2l0cywgJGRlbm9taW5hdGlvbik7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaSAlIDMgPT0gMikgewogICAgICAgICAgICAgICAgJGZpcnN0VHdvRGlnaXQgPSBnZXREaWdpdHMoJG51bWJlciwgJGkgLSAyKTsKICAgICAgICAgICAgICAgICRudW1iZXIgPSBnZXRSZW1haW5kZXIoJG51bWJlciwgJGkgLSAyKTsKICAgICAgICAgICAgICAgICRyZXN1bHRFeHBbXSA9IGRpZ2l0c1RvV29yZHMoJGZpcnN0VHdvRGlnaXQsICRudW1iZXJzLCAkaXNGZW1hbGUpOwogICAgICAgICAgICAgICAgJHJlc3VsdEV4cFtdID0gd29yZCgkZmlyc3RUd29EaWdpdCwgJGRlbm9taW5hdGlvbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZmlyc3REaWdpdCA9IGdldERpZ2l0cygkbnVtYmVyLCAkaSAtIDEpOwogICAgICAgICAgICAgICAgJG51bWJlciA9IGdldFJlbWFpbmRlcigkbnVtYmVyLCAkaSAtIDEpOwogICAgICAgICAgICAgICAgLy9lY2hvICRudW1iZXIgLiAiXG4iOwogICAgICAgICAgICAgICAgJHJlc3VsdEV4cFtdID0gZGlnaXRzVG9Xb3JkcygkZmlyc3REaWdpdCwgJG51bWJlcnMsICRpc0ZlbWFsZSk7CiAgICAgICAgICAgICAgICAkcmVzdWx0RXhwW10gPSB3b3JkKCRmaXJzdERpZ2l0LCAkZGVub21pbmF0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXN1bHRFeHBbXSA9IGRpZ2l0c1RvV29yZHMoJG51bWJlciwgJG51bWJlcnMsIGZhbHNlKTsKICAgICAgICAgICAgJHJlc3VsdEV4cFtdID0gd29yZCgkbnVtYmVyLCAkcnVibGVzKTsKICAgICAgICAgICAgYnJlYWs7Ly/QktGL0YXQvtC00LjQvCDQuNC3INGG0LjQutC70LAsINGCLtC6LiDRg9C20LUg0YDQsNGB0L/QuNGB0LDQu9C4INCy0YHQtSDRhtC40YTRgNGLCiAgICAgICAgfQogICAgfQp9ICAgZWxzZXsKICAgICRyZXN1bHRFeHBbXSA9ICRudW1iZXJzWyRudW1iZXJdOwogICAgJHJlc3VsdEV4cFtdID0gd29yZCgkbnVtYmVyLCAkcnVibGVzKTsKfQplY2hvICJSZXN1bHQ6ICIgLiBpbXBsb2RlKCIgIiwgJHJlc3VsdEV4cCkgLiAiXG4iOwo/Pg==