<?php
// Staring straight up into the sky ... oh my my
/* Возвращает соответствующую числу форму слова: 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 )
{
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 => 'девятнадцать'
) ;
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 рублей' ;
}
$millions = '' ;
$thousand = '' ;
$hundred = '' ;
$numbers = preg_split ( '/,/' , $number , 0 , PREG_SPLIT_NO_EMPTY
) ; //Миллионы
if ( count ( $numbers ) > 2 ) { $millions = smallNumberToText( $triad , 0 ) ;
$millions .= ' ' . inclineWord( $triad , 'миллион' , 'миллиона' , 'миллионов' ) ;
}
//тысячи
if ( count ( $numbers ) > 1 ) { $lastNum = end ( $lastNum ) ; if ( $lastNum < 2 ) {
$thousand = smallNumberToText( $triad , 1 ) ;
} else {
$thousand = smallNumberToText( $triad , 0 ) ;
}
$thousand .= ' ' . inclineWord( $triad , 'тысяча' , 'тысячи' , 'тысяч' ) ;
}
//Меньше тысячи
if ( count ( $numbers ) > 0 ) { $hundred = smallNumberToText( $triad , 0 ) ;
$hundred .= ' (' . $number . ') ' ;
$hundred .= ' ' . inclineWord( $triad , 'рубль' , 'рубля' , 'рублей' ) ;
}
//склеиваем и возвращаем
$number = trim ( $millions . ' ' . $thousand . ' ' . $hundred ) ; return $number ;
}
/* Вызовем функцию несколько раз */
$text1 = numberToText( $amount1 ) ;
echo "На вашем счету {$text1} \n " ;
$text2 = numberToText( $amount2 ) ;
echo "На вашем счету {$text2} \n " ;
$text3 = numberToText( $amount3 ) ;
echo "На вашем счету {$text3} \n " ;
$text4 = numberToText( $amount4 ) ;
echo "На вашем счету {$text4} \n " ;
PD9waHAKCi8vIFN0YXJpbmcgc3RyYWlnaHQgdXAgaW50byB0aGUgc2t5IC4uLiBvaCBteSBteQplcnJvcl9yZXBvcnRpbmcoLTEpOwptYl9pbnRlcm5hbF9lbmNvZGluZygndXRmLTgnKTsKCgovKiDQktC+0LfQstGA0LDRidCw0LXRgiDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0Y7RidGD0Y4g0YfQuNGB0LvRgyDRhNC+0YDQvNGDINGB0LvQvtCy0LA6IDEg0YDRg9Cx0LvRjCwgMiDRgNGD0LHQu9GPLCA1INGA0YPQsdC70LXQuSAqLwpmdW5jdGlvbiBpbmNsaW5lV29yZCgkbnVtYmVyLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzKQp7CiAgICAkbnVtYmVyICU9IDEwMDsKICAgIC8v0LTQviAyMAogICAgaWYgKCRudW1iZXIgPCAyMCkgewogICAgICAgIGlmICgkbnVtYmVyID09IDEpIHsKICAgICAgICAgICAgcmV0dXJuICR3b3JkMTsKICAgICAgICB9IGVsc2VpZiAoKCRudW1iZXIgPCA1KSAmJiAoJG51bWJlciAhPSAwKSkgewogICAgICAgICAgICByZXR1cm4gJHdvcmQyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkd29yZDM7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvL9C10YHQu9C4INCx0L7Qu9GM0YjQtSAyMCDRgtC+INGC0L7Qu9GM0LrQviDQv9C+INC/0L7RgdC70LXQtNC90LXQuSDRhtC40YTRgNC1LgogICAgICAgICRudW1iZXIgJT0gMTA7CiAgICAgICAgaWYgKCRudW1iZXIgPT0gMSkgewogICAgICAgICAgICByZXR1cm4gJHdvcmQxOwogICAgICAgIH0gZWxzZWlmICgoJG51bWJlciA8IDUpICYmICgkbnVtYmVyICE9IDApKSB7CiAgICAgICAgICAgIHJldHVybiAkd29yZDI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICR3b3JkMzsKICAgICAgICB9CiAgICB9Cn0KCi8qCiAg0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDRh9C40YHQu9CwINC+0YIgMCDQtNC+IDk5OSDQsiDRgtC10LrRgdGCLiDQn9Cw0YDQsNC80LXRgtGAICRpc0ZlbWFsZSDRgNCw0LLQtdC9INC90YPQu9GOLAogINC10YHQu9C4INC80Ysg0YHRh9C40YLQsNC10Lwg0YfQuNGB0LvQviDQtNC70Y8g0LzRg9C20YHQutC+0LPQviDRgNC+0LTQsCAo0L7QtNC40L0g0YDRg9Cx0LvRjCksCiAg0LggMSDigJQg0LTQu9GPINC20LXQvdGB0LrQvtCz0L4gKNC+0LTQvdCwINGC0YvRgdGP0YfQsCkKKi8KCmZ1bmN0aW9uIHNtYWxsTnVtYmVyVG9UZXh0KCRudW1iZXIsICRpc0ZlbWFsZSkKewoKICAgICRzcGVsbGluZyA9IGFycmF5KAogICAgICAgIDAgPT4gJ9C90L7Qu9GMJywgMTAgPT4gJ9C00LXRgdGP0YLRjCcsIDEwMCA9PiAn0YHRgtC+JywKICAgICAgICAxID0+ICfQvtC00LjQvScsIDExID0+ICfQvtC00LjQvdC90LDQtNGG0LDRgtGMJywgMjAgPT4gJ9C00LLQsNC00YbQsNGC0YwnLCAyMDAgPT4gJ9C00LLQtdGB0YLQuCcsCiAgICAgICAgMiA9PiAn0LTQstCwJywgMTIgPT4gJ9C00LLQtdC90LDQtNGG0LDRgtGMJywgMzAgPT4gJ9GC0YDQuNC00YbQsNGC0YwnLCAzMDAgPT4gJ9GC0YDQuNGB0YLQsCcsCiAgICAgICAgMyA9PiAn0YLRgNC4JywgMTMgPT4gJ9GC0YDQuNC90LDQtNGG0LDRgtGMJywgNDAgPT4gJ9GB0L7RgNC+0LonLCA0MDAgPT4gJ9GH0LXRgtGL0YDQtdGB0YLQsCcsCiAgICAgICAgNCA9PiAn0YfQtdGC0YvRgNC1JywgMTQgPT4gJ9GH0LXRgtGL0YDQvdCw0LTRhtCw0YLRjCcsIDUwID0+ICfQv9GP0YLRjNC00LXRgdGP0YInLCA1MDAgPT4gJ9C/0Y/RgtGM0YHQvtGCJywKICAgICAgICA1ID0+ICfQv9GP0YLRjCcsIDE1ID0+ICfQv9GP0YLQvdCw0LTRhtCw0YLRjCcsIDYwID0+ICfRiNC10YHRgtGM0LTQtdGB0Y/RgicsIDYwMCA9PiAn0YjQtdGB0YLRjNGB0L7RgicsCiAgICAgICAgNiA9PiAn0YjQtdGB0YLRjCcsIDE2ID0+ICfRiNC10YHRgtC90LDQtNGG0LDRgtGMJywgNzAgPT4gJ9GB0LXQvNGM0LTQtdGB0Y/RgicsIDcwMCA9PiAn0YHQtdC80YzRgdC+0YInLAogICAgICAgIDcgPT4gJ9GB0LXQvNGMJywgMTcgPT4gJ9GB0LXQvNC90LDQtNGG0LDRgtGMJywgODAgPT4gJ9Cy0L7RgdC10LzRjNC00LXRgdGP0YInLCA4MDAgPT4gJ9Cy0L7RgdC10LzRjNGB0L7RgicsCiAgICAgICAgOCA9PiAn0LLQvtGB0LXQvNGMJywgMTggPT4gJ9Cy0L7RgdC10LzQvdCw0LTRhtCw0YLRjCcsIDkwID0+ICfQtNC10LLRj9C90L7RgdGC0L4nLCA5MDAgPT4gJ9C00LXQstGP0YLRjNGB0L7RgicsCiAgICAgICAgOSA9PiAn0LTQtdCy0Y/RgtGMJywgMTkgPT4gJ9C00LXQstGP0YLQvdCw0LTRhtCw0YLRjCcKICAgICk7CgogICAgJGZlbWFsZVNwZWxsaW5nID0gYXJyYXkoCiAgICAgICAgMSA9PiAn0L7QtNC90LAnLCAyID0+ICfQtNCy0LUnCiAgICApOwoKICAgIGlmKCRudW1iZXIgPT0gMCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgICRzdHJOdW0gPSAnJzsKICAgICRodW5kcmVkID0gZmxvb3IoJG51bWJlciAvIDEwMCk7CiAgICAkZGVjID0gZmxvb3IoKCRudW1iZXIgJSAxMDApIC8gMTApOwogICAgJGZpcnN0TnVtYmVyID0gJG51bWJlciAlIDEwOwogICAgaWYgKCRodW5kcmVkKSB7CiAgICAgICAgJGtleSA9ICRodW5kcmVkICogMTAwOwogICAgICAgICRzdHJOdW0gLj0gJHNwZWxsaW5nWyRrZXldIC4gJyAnOwogICAgICAgIGlmICgoJG51bWJlciAlIDEwMCkgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gJHN0ck51bTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRkZWMpIHsKICAgICAgICBpZiAoJGRlYyA9PSAxKSB7CiAgICAgICAgICAgICRrZXkgPSAkbnVtYmVyICUgMTAwOwogICAgICAgICAgICAkc3RyTnVtIC49ICRzcGVsbGluZ1ska2V5XSAuICcgJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAka2V5ID0gJGRlYyAqIDEwOwogICAgICAgICAgICAkc3RyTnVtIC49ICRzcGVsbGluZ1ska2V5XSAuICcgJzsKICAgICAgICB9CiAgICAgICAgaWYgKCEkZmlyc3ROdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuICRzdHJOdW07CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkZGVjICE9IDEpIHsKICAgICAgICBpZiAoKCgkZmlyc3ROdW1iZXIgPT0gMSkgb3IgKCRmaXJzdE51bWJlciA9PSAyKSkgYW5kICgkaXNGZW1hbGUgPT0gMSkpIHsKICAgICAgICAgICAgJHN0ck51bSAuPSAkZmVtYWxlU3BlbGxpbmdbJGZpcnN0TnVtYmVyXSAuICcgJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc3RyTnVtIC49ICRzcGVsbGluZ1skZmlyc3ROdW1iZXJdOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkc3RyTnVtOwp9CgpmdW5jdGlvbiBudW1iZXJUb1RleHQoJG51bWJlcikKewogICAgaWYgKCRudW1iZXIgPT0gMCkgewogICAgICAgIHJldHVybiAnMCDRgNGD0LHQu9C10LknOwogICAgfQogICAgJG51bWJlciA9IG51bWJlcl9mb3JtYXQoJG51bWJlcik7CiAgICAkbWlsbGlvbnMgPSAnJzsKICAgICR0aG91c2FuZCA9ICcnOwogICAgJGh1bmRyZWQgPSAnJzsKICAgICRudW1iZXJzID0gcHJlZ19zcGxpdCgnLywvJywgJG51bWJlciwgMCwgUFJFR19TUExJVF9OT19FTVBUWSk7CiAgICAvL9Cc0LjQu9C70LjQvtC90YsKICAgIGlmIChjb3VudCgkbnVtYmVycykgPiAyKSB7CiAgICAgICAgJHRyaWFkID0gYXJyYXlfc2hpZnQoJG51bWJlcnMpOwogICAgICAgICRtaWxsaW9ucyA9IHNtYWxsTnVtYmVyVG9UZXh0KCR0cmlhZCwgMCk7CiAgICAgICAgJG1pbGxpb25zIC49ICcgJyAuIGluY2xpbmVXb3JkKCR0cmlhZCwgJ9C80LjQu9C70LjQvtC9JywgJ9C80LjQu9C70LjQvtC90LAnLCAn0LzQuNC70LvQuNC+0L3QvtCyJyk7CiAgICB9CiAgICAvL9GC0YvRgdGP0YfQuAogICAgaWYgKGNvdW50KCRudW1iZXJzKSA+IDEpIHsKICAgICAgICAkdHJpYWQgPSBhcnJheV9zaGlmdCgkbnVtYmVycyk7CiAgICAgICAgJGxhc3ROdW0gPSBwcmVnX3NwbGl0KCcvLycsICR0cmlhZCk7CiAgICAgICAgJGxhc3ROdW0gPSBlbmQoJGxhc3ROdW0pOwogICAgICAgIGlmICgkbGFzdE51bSA8IDIpIHsKICAgICAgICAgICAgJHRob3VzYW5kID0gc21hbGxOdW1iZXJUb1RleHQoJHRyaWFkLCAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhvdXNhbmQgPSBzbWFsbE51bWJlclRvVGV4dCgkdHJpYWQsIDApOwogICAgICAgIH0KICAgICAgICAkdGhvdXNhbmQgLj0gJyAnIC4gaW5jbGluZVdvcmQoJHRyaWFkLCAn0YLRi9GB0Y/Rh9CwJywgJ9GC0YvRgdGP0YfQuCcsICfRgtGL0YHRj9GHJyk7CiAgICB9CiAgICAvL9Cc0LXQvdGM0YjQtSDRgtGL0YHRj9GH0LgKICAgIGlmIChjb3VudCgkbnVtYmVycykgPiAwKSB7CiAgICAgICAgJHRyaWFkID0gYXJyYXlfc2hpZnQoJG51bWJlcnMpOwogICAgICAgICRodW5kcmVkID0gc21hbGxOdW1iZXJUb1RleHQoJHRyaWFkLCAwKTsKICAgICAgICAkaHVuZHJlZCAuPSAnICgnIC4gJG51bWJlciAuICcpICc7CiAgICAgICAgJGh1bmRyZWQgLj0gJyAnIC4gaW5jbGluZVdvcmQoJHRyaWFkLCAn0YDRg9Cx0LvRjCcsICfRgNGD0LHQu9GPJywgJ9GA0YPQsdC70LXQuScpOwogICAgfQogICAgLy/RgdC60LvQtdC40LLQsNC10Lwg0Lgg0LLQvtC30LLRgNCw0YnQsNC10LwKICAgICRudW1iZXIgPSB0cmltKCRtaWxsaW9ucyAuICcgJyAuICR0aG91c2FuZCAuICcgJyAuICRodW5kcmVkKTsKICAgICRudW1iZXIgPSBwcmVnX3JlcGxhY2UoJy8gKy8nLCAnICcsICRudW1iZXIpOwogICAgcmV0dXJuICRudW1iZXI7Cn0KCi8qINCS0YvQt9C+0LLQtdC8INGE0YPQvdC60YbQuNGOINC90LXRgdC60L7Qu9GM0LrQviDRgNCw0LcgKi8KJGFtb3VudDEgPSBtdF9yYW5kKDEsOTk5OTk5OTkpOwokdGV4dDEgPSBudW1iZXJUb1RleHQoJGFtb3VudDEpOwoKZWNobyAi0J3QsCDQstCw0YjQtdC8INGB0YfQtdGC0YMgeyR0ZXh0MX1cbiI7CgokYW1vdW50MiA9IG10X3JhbmQoMSw5OTk5OTk5OSk7CiR0ZXh0MiA9IG51bWJlclRvVGV4dCgkYW1vdW50Mik7CgplY2hvICLQndCwINCy0LDRiNC10Lwg0YHRh9C10YLRgyB7JHRleHQyfVxuIjsKCiRhbW91bnQzID0gbXRfcmFuZCgxLDk5OTk5OTk5KTsKJHRleHQzID0gbnVtYmVyVG9UZXh0KCRhbW91bnQzKTsKCmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDN9XG4iOwoKJGFtb3VudDQgPSBtdF9yYW5kKDEsOTk5OTk5OTkpOwokdGV4dDQgPSBudW1iZXJUb1RleHQoJGFtb3VudDQpOwoKZWNobyAi0J3QsCDQstCw0YjQtdC8INGB0YfQtdGC0YMgeyR0ZXh0NH1cbiI7