<?php
header ( "Content-Type: text/plain; charset=UTF-8" ) ;
/* Возвращает соответствующую числу форму слова, например: 1 рубль, 2 рубля, 5 рублей. */
function inclineWord( $number , $word1 , $word2 , $word5 )
{
$numberOneLastDigit = $number % 10 ;
$numberTwoLastDigits = $number % 100 ;
if ( $numberTwoLastDigits > 10 && $numberTwoLastDigits < 20 ) {
return $word5 ;
}
if ( $numberOneLastDigit == 1 ) {
return $word1 ;
}
if ( $numberOneLastDigit > 1 && $numberOneLastDigit < 5 ) {
return $word2 ;
}
return $word5 ;
}
/*
Преобразует числа от 0 до 999 в текст.
Параметр $isFemale равен "0", если мы считаем число для мужского рода (один рубль),
и равен "1" для женского (одна тысяча).
*/
function smallNumberToText( $number , $isFemale )
{
0 => 'ноль' ,
1 => 'один' , 11 => 'одиннадцать' , 10 => 'десять' , 100 => 'сто' ,
2 => 'два' , 12 => 'двенадцать' , 20 => 'двадцать' , 200 => 'двести' ,
3 => 'три' , 13 => 'тринадцать' , 30 => 'тридцать' , 300 => 'триста' ,
4 => 'четыре' , 14 => 'четырнадцать' , 40 => 'сорок' , 400 => 'четыреста' ,
5 => 'пять' , 15 => 'пятнадцать' , 50 => 'пятьдесят' , 500 => 'пятьсот' ,
6 => 'шесть' , 16 => 'шестнадцать' , 60 => 'шестьдесят' , 600 => 'шестьсот' ,
7 => 'семь' , 17 => 'семнадцать' , 70 => 'семьдесят' , 700 => 'семьсот' ,
8 => 'восемь' , 18 => 'восемнадцать' , 80 => 'восемьдесят' , 800 => 'восемьсот' ,
9 => 'девять' , 19 => 'девятнадцать' , 90 => 'девяносто' , 900 => 'девятьсот'
) ;
1 => 'одна' , 2 => 'две'
) ;
$numberLastDigit = $number % 10 ;
$numberTens = $number % 100 ;
$numberHuns = $number % 1000 ;
$numberTensRound = $numberTens - $numberLastDigit ;
$numberHunsRound = $number - $numberTens ;
$result = '' ;
if ( $number == 0 ) {
return $spelling [ 0 ] ;
}
if ( $number >= 100 ) {
$result .= "{$spelling [$numberHunsRound ]} " ;
}
if ( $numberTens >= 10 && $numberTens <= 20 ) {
$result .= "{$spelling [$numberTens ]}" ;
return $result ;
}
if ( $numberTens >= 20 ) {
$result .= "{$spelling [$numberTensRound ]} " ;
}
if ( $isFemale && ( $numberLastDigit == 1 || $numberLastDigit == 2 ) ) {
$result .= "$femaleSpelling [$numberLastDigit ]" ;
return $result ;
}
if ( $numberLastDigit > 0 ) {
$result .= "{$spelling [$numberLastDigit ]}" ;
}
return $result ;
}
function numberToText( $number )
{
$result = '' ;
$numberHuns = $number % 1000 ;
$numberThos = floor ( $number / 1000 ) % 1000 ; $numberMils = floor ( floor ( $number / 1000 ) / 1000 ) ;
$rubs = inclineWord( $numberHuns , "рубль" , "рубля" , "рублей" ) ;
$thos = inclineWord( $numberThos , "тысяча" , "тысячи" , "тысяч" ) ;
$mils = inclineWord( $numberMils , "миллион" , "миллиона" , "миллионов" ) ;
if ( $number == 0 ) {
$result = smallNumberToText( 0 , 0 ) ;
}
if ( $numberMils != 0 ) {
$numberToText = smallNumberToText( $numberMils , 0 ) ;
$result .= "$numberToText $mils " ;
}
if ( $numberThos != 0 ) {
$numberToText = smallNumberToText( $numberThos , 1 ) ;
$result .= "$numberToText $thos " ;
}
if ( $numberHuns != 0 ) {
$numberToText = smallNumberToText( $numberHuns , 0 ) ;
$result .= "$numberToText " ;
}
$result .= " ($number ) $rubs " ;
/* Грязный хак для удаления лишних пробелов */
return $result ;
}
for ( $i = 0 ; $i < 10 ; $i ++ ) {
echo numberToText( $rand ) . "\n " ;
}
echo "\n " ;
echo numberToText( 1 ) . "\n " ;
echo numberToText( 100 ) . "\n " ;
echo numberToText( 1000 ) . "\n " ;
echo numberToText( 1002 ) . "\n " ;
echo numberToText( 1000013 ) . "\n " ;
echo numberToText( 1001000 ) . "\n " ;
echo numberToText( 1002001 ) . "\n " ;
echo numberToText( 0 ) . "\n " ;
PD9waHAKCm1iX2ludGVybmFsX2VuY29kaW5nKCd1dGYtOCcpOwpoZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCIpOwoKLyog0JLQvtC30LLRgNCw0YnQsNC10YIg0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YnRg9GOINGH0LjRgdC70YMg0YTQvtGA0LzRgyDRgdC70L7QstCwLCDQvdCw0L/RgNC40LzQtdGAOiAxINGA0YPQsdC70YwsIDIg0YDRg9Cx0LvRjywgNSDRgNGD0LHQu9C10LkuICovCmZ1bmN0aW9uIGluY2xpbmVXb3JkKCRudW1iZXIsICR3b3JkMSwgJHdvcmQyLCAkd29yZDUpCnsKICAgICRudW1iZXJPbmVMYXN0RGlnaXQgPSAgICRudW1iZXIgJSAxMDsKICAgICRudW1iZXJUd29MYXN0RGlnaXRzID0gICRudW1iZXIgJSAxMDA7CgogICAgaWYgKCRudW1iZXJUd29MYXN0RGlnaXRzID4gMTAgJiYgJG51bWJlclR3b0xhc3REaWdpdHMgPCAyMCkgewogICAgICAgIHJldHVybiAkd29yZDU7CiAgICB9CgogICAgaWYgKCRudW1iZXJPbmVMYXN0RGlnaXQgPT0gMSkgewogICAgICAgIHJldHVybiAkd29yZDE7CiAgICB9CgogICAgaWYgKCRudW1iZXJPbmVMYXN0RGlnaXQgPiAxICYmICRudW1iZXJPbmVMYXN0RGlnaXQgPCA1KSB7CiAgICAgICAgcmV0dXJuICR3b3JkMjsKICAgIH0KCiAgICByZXR1cm4gJHdvcmQ1Owp9CgovKiAKICAgINCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0YfQuNGB0LvQsCDQvtGCIDAg0LTQviA5OTkg0LIg0YLQtdC60YHRgi4KICAgINCf0LDRgNCw0LzQtdGC0YAgJGlzRmVtYWxlINGA0LDQstC10L0gIjAiLCDQtdGB0LvQuCDQvNGLINGB0YfQuNGC0LDQtdC8INGH0LjRgdC70L4g0LTQu9GPINC80YPQttGB0LrQvtCz0L4g0YDQvtC00LAgKNC+0LTQuNC9INGA0YPQsdC70YwpLAogICAg0Lgg0YDQsNCy0LXQvSAiMSIg0LTQu9GPINC20LXQvdGB0LrQvtCz0L4gKNC+0LTQvdCwINGC0YvRgdGP0YfQsCkuCiovCmZ1bmN0aW9uIHNtYWxsTnVtYmVyVG9UZXh0KCRudW1iZXIsICRpc0ZlbWFsZSkKewogICAgJHNwZWxsaW5nID0gYXJyYXkoCiAgICAgICAgMCAgID0+ICAn0L3QvtC70YwnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAxICAgPT4gICfQvtC00LjQvScsICAgICAgICAgMTEgID0+ICAn0L7QtNC40L3QvdCw0LTRhtCw0YLRjCcsICAgICAgMTAgID0+ICAn0LTQtdGB0Y/RgtGMJywgICAgICAgMTAwID0+ICAn0YHRgtC+JywKICAgICAgICAyICAgPT4gICfQtNCy0LAnLCAgICAgICAgICAxMiAgPT4gICfQtNCy0LXQvdCw0LTRhtCw0YLRjCcsICAgICAgIDIwICA9PiAgJ9C00LLQsNC00YbQsNGC0YwnLCAgICAgMjAwID0+ICAn0LTQstC10YHRgtC4JywKICAgICAgICAzICAgPT4gICfRgtGA0LgnLCAgICAgICAgICAxMyAgPT4gICfRgtGA0LjQvdCw0LTRhtCw0YLRjCcsICAgICAgIDMwICA9PiAgJ9GC0YDQuNC00YbQsNGC0YwnLCAgICAgMzAwID0+ICAn0YLRgNC40YHRgtCwJywKICAgICAgICA0ICAgPT4gICfRh9C10YLRi9GA0LUnLCAgICAgICAxNCAgPT4gICfRh9C10YLRi9GA0L3QsNC00YbQsNGC0YwnLCAgICAgNDAgID0+ICAn0YHQvtGA0L7QuicsICAgICAgICA0MDAgPT4gICfRh9C10YLRi9GA0LXRgdGC0LAnLAogICAgICAgIDUgICA9PiAgJ9C/0Y/RgtGMJywgICAgICAgICAxNSAgPT4gICfQv9GP0YLQvdCw0LTRhtCw0YLRjCcsICAgICAgIDUwICA9PiAgJ9C/0Y/RgtGM0LTQtdGB0Y/RgicsICAgIDUwMCA9PiAgJ9C/0Y/RgtGM0YHQvtGCJywKICAgICAgICA2ICAgPT4gICfRiNC10YHRgtGMJywgICAgICAgIDE2ICA9PiAgJ9GI0LXRgdGC0L3QsNC00YbQsNGC0YwnLCAgICAgIDYwICA9PiAgJ9GI0LXRgdGC0YzQtNC10YHRj9GCJywgICA2MDAgPT4gICfRiNC10YHRgtGM0YHQvtGCJywKICAgICAgICA3ICAgPT4gICfRgdC10LzRjCcsICAgICAgICAgMTcgID0+ICAn0YHQtdC80L3QsNC00YbQsNGC0YwnLCAgICAgICA3MCAgPT4gICfRgdC10LzRjNC00LXRgdGP0YInLCAgICA3MDAgPT4gICfRgdC10LzRjNGB0L7RgicsICAgIAogICAgICAgIDggICA9PiAgJ9Cy0L7RgdC10LzRjCcsICAgICAgIDE4ICA9PiAgJ9Cy0L7RgdC10LzQvdCw0LTRhtCw0YLRjCcsICAgICA4MCAgPT4gICfQstC+0YHQtdC80YzQtNC10YHRj9GCJywgIDgwMCA9PiAgJ9Cy0L7RgdC10LzRjNGB0L7RgicsCiAgICAgICAgOSAgID0+ICAn0LTQtdCy0Y/RgtGMJywgICAgICAgMTkgID0+ICAn0LTQtdCy0Y/RgtC90LDQtNGG0LDRgtGMJywgICAgIDkwICA9PiAgJ9C00LXQstGP0L3QvtGB0YLQvicsICAgIDkwMCA9PiAgJ9C00LXQstGP0YLRjNGB0L7RgicKICAgICk7CiAgICAKICAgICRmZW1hbGVTcGVsbGluZyA9IGFycmF5KAogICAgICAgIDEgICA9PiAgJ9C+0LTQvdCwJywgICAgICAgICAyICAgPT4gICfQtNCy0LUnCiAgICApOwoKICAgICRudW1iZXIgPSBpbnR2YWwoJG51bWJlcik7CgogICAgJG51bWJlckxhc3REaWdpdCA9ICAkbnVtYmVyICUgMTA7CiAgICAkbnVtYmVyVGVucyA9ICAgICAgICRudW1iZXIgJSAxMDA7CiAgICAkbnVtYmVySHVucyA9ICAgICAgICRudW1iZXIgJSAxMDAwOwoKICAgICRudW1iZXJUZW5zUm91bmQgPSAkbnVtYmVyVGVucyAtICRudW1iZXJMYXN0RGlnaXQ7CiAgICAkbnVtYmVySHVuc1JvdW5kID0gJG51bWJlciAtICRudW1iZXJUZW5zOwoKICAgICRyZXN1bHQgPSAnJzsKCiAgICBpZiAoJG51bWJlciA9PSAwKSB7CiAgICAgICAgcmV0dXJuICRzcGVsbGluZ1swXTsKICAgIH0KCiAgICBpZiAoJG51bWJlciA+PSAxMDApIHsKICAgICAgICAkcmVzdWx0IC49ICJ7JHNwZWxsaW5nWyRudW1iZXJIdW5zUm91bmRdfSAiOwogICAgfQoKICAgIGlmICgkbnVtYmVyVGVucyA+PSAxMCAmJiAkbnVtYmVyVGVucyA8PSAyMCkgewogICAgICAgICRyZXN1bHQgLj0gInskc3BlbGxpbmdbJG51bWJlclRlbnNdfSI7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgaWYgKCRudW1iZXJUZW5zID49IDIwKSB7CiAgICAgICAgJHJlc3VsdCAuPSAieyRzcGVsbGluZ1skbnVtYmVyVGVuc1JvdW5kXX0gIjsKICAgIH0KCiAgICBpZiAoJGlzRmVtYWxlICYmICgkbnVtYmVyTGFzdERpZ2l0ID09IDEgfHwgJG51bWJlckxhc3REaWdpdCA9PSAyKSkgewogICAgICAgICRyZXN1bHQgLj0gIiRmZW1hbGVTcGVsbGluZ1skbnVtYmVyTGFzdERpZ2l0XSI7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgaWYgKCRudW1iZXJMYXN0RGlnaXQgPiAwKSB7CiAgICAgICAgJHJlc3VsdCAuPSAieyRzcGVsbGluZ1skbnVtYmVyTGFzdERpZ2l0XX0iOwogICAgfQoKICAgIHJldHVybiAkcmVzdWx0Owp9CgpmdW5jdGlvbiBudW1iZXJUb1RleHQoJG51bWJlcikKewogICAgJHJlc3VsdCA9ICcnOwoKICAgICRudW1iZXJIdW5zID0gJG51bWJlciAlIDEwMDA7CiAgICAkbnVtYmVyVGhvcyA9IGZsb29yKCRudW1iZXIgLyAxMDAwKSAlIDEwMDA7CiAgICAkbnVtYmVyTWlscyA9IGZsb29yKGZsb29yKCRudW1iZXIgLyAxMDAwKSAvIDEwMDApOwoKICAgICRydWJzID0gaW5jbGluZVdvcmQoJG51bWJlckh1bnMsICLRgNGD0LHQu9GMIiwgItGA0YPQsdC70Y8iLCAi0YDRg9Cx0LvQtdC5Iik7CiAgICAkdGhvcyA9IGluY2xpbmVXb3JkKCRudW1iZXJUaG9zLCAi0YLRi9GB0Y/Rh9CwIiwgItGC0YvRgdGP0YfQuCIsICLRgtGL0YHRj9GHIik7CiAgICAkbWlscyA9IGluY2xpbmVXb3JkKCRudW1iZXJNaWxzLCAi0LzQuNC70LvQuNC+0L0iLCAi0LzQuNC70LvQuNC+0L3QsCIsICLQvNC40LvQu9C40L7QvdC+0LIiKTsKCiAgICBpZiAoJG51bWJlciA9PSAwKSB7CiAgICAgICAgJHJlc3VsdCA9IHNtYWxsTnVtYmVyVG9UZXh0KDAsIDApOwogICAgfQoKICAgIGlmICgkbnVtYmVyTWlscyAhPSAwKSB7CiAgICAgICAgJG51bWJlclRvVGV4dCA9IHNtYWxsTnVtYmVyVG9UZXh0KCRudW1iZXJNaWxzLCAwKTsKICAgICAgICAkcmVzdWx0IC49ICIkbnVtYmVyVG9UZXh0ICRtaWxzICI7CiAgICB9CgogICAgaWYgKCRudW1iZXJUaG9zICE9IDApIHsKICAgICAgICAkbnVtYmVyVG9UZXh0ID0gc21hbGxOdW1iZXJUb1RleHQoJG51bWJlclRob3MsIDEpOwogICAgICAgICRyZXN1bHQgLj0gIiRudW1iZXJUb1RleHQgJHRob3MgIjsKICAgIH0KCiAgICBpZiAoJG51bWJlckh1bnMgIT0gMCkgewogICAgICAgICRudW1iZXJUb1RleHQgPSBzbWFsbE51bWJlclRvVGV4dCgkbnVtYmVySHVucywgMCk7CiAgICAgICAgJHJlc3VsdCAuPSAiJG51bWJlclRvVGV4dCI7CiAgICB9CgogICAgJHJlc3VsdCAuPSAiICgkbnVtYmVyKSAkcnVicyI7CgogICAgLyog0JPRgNGP0LfQvdGL0Lkg0YXQsNC6INC00LvRjyDRg9C00LDQu9C10L3QuNGPINC70LjRiNC90LjRhSDQv9GA0L7QsdC10LvQvtCyICovCiAgICAkcmVzdWx0ID0gcHJlZ19yZXBsYWNlKCcvXFxzKy8nLCAiICIsICRyZXN1bHQpOwoKICAgIHJldHVybiAkcmVzdWx0Owp9Cgpmb3IgKCRpPTA7ICRpPDEwOyAkaSsrKSB7CiAgICAkcmFuZCA9IG10X3JhbmQoMSwgOTk5OTk5OTk5KTsKICAgIGVjaG8gbnVtYmVyVG9UZXh0KCRyYW5kKSAuICJcbiI7Cn0KCmVjaG8gIlxuIjsKZWNobyBudW1iZXJUb1RleHQoMSkgLiAiXG4iOwplY2hvIG51bWJlclRvVGV4dCgxMDApIC4gIlxuIjsKZWNobyBudW1iZXJUb1RleHQoMTAwMCkgLiAiXG4iOwplY2hvIG51bWJlclRvVGV4dCgxMDAyKSAuICJcbiI7CmVjaG8gbnVtYmVyVG9UZXh0KDEwMDAwMTMpIC4gIlxuIjsKZWNobyBudW1iZXJUb1RleHQoMTAwMTAwMCkgLiAiXG4iOwplY2hvIG51bWJlclRvVGV4dCgxMDAyMDAxKSAuICJcbiI7CmVjaG8gbnVtYmVyVG9UZXh0KDApIC4gIlxuIjs=