= 10 && $n <= 19); $ret = ''; switch($n) { case 10: $ret = 'десять '; break; case 11: $ret = 'одиннадцать '; break; case 12: $ret = 'двенадцать '; break; case 13: $ret = 'тринадцать '; break; case 14: $ret = 'четырнадцать '; break; case 15: $ret = 'пятнадцать '; break; case 16: $ret = 'шестнадцать '; break; case 17: $ret = 'семнадцать '; break; case 18: $ret = 'восемнадцать '; break; case 19: $ret = 'девятнадцать '; break; } return $ret; } /* Цифра от 1 до 9. */ private static function num2str1_9($n, $gender) { assert($n >= 0 && $n <= 9); $ret = ''; switch($n) { case 1: $ret = $gender ? 'один ' : 'одна '; break; case 2: $ret = $gender ? 'два ' : 'две '; break; case 3: $ret = 'три '; break; case 4: $ret = 'четыре '; break; case 5: $ret = 'пять '; break; case 6: $ret = 'шесть '; break; case 7: $ret = 'семь '; break; case 8: $ret = 'восемь '; break; case 9: $ret = 'девять '; break; } return $ret; } /* Число от 1 до 999 */ private static function num2str1_999($n, $gender) { assert($n >= 1 && $n <= 999); $ret = ''; switch(floor($n / 100) % 10) { case 1: $ret .= 'сто '; break; case 2: $ret .= 'двести '; break; case 3: $ret .= 'триста '; break; case 4: $ret .= 'четыреста '; break; case 5: $ret .= 'пятьсот '; break; case 6: $ret .= 'шестьсот '; break; case 7: $ret .= 'семьсот '; break; case 8: $ret .= 'восемьсот '; break; case 9: $ret .= 'девятьсот '; break; } if(floor($n / 10) % 10 == 1) { $ret .= CostConverter::num2str10_19($n % 100); } else { switch(floor($n / 10) % 10) { case 2: $ret .= 'двадцать '; break; case 3: $ret .= 'тридцать '; break; case 4: $ret .= 'сорок '; break; case 5: $ret .= 'пятьдесят '; break; case 6: $ret .= 'шестьдесят '; break; case 7: $ret .= 'семьдесят '; break; case 8: $ret .= 'восемьдесят '; break; case 9: $ret .= 'девяносто '; break; } $ret .= CostConverter::num2str1_9($n % 10, $gender); } return $ret; } /** Отдать число с окончанием по шаманским правилам русского языка @param n:int - число @param words:array[3] - три варианта слова типа рубль, рубля, рублей */ private static function magick_ending($n, $words) { $ret = ''; if($n % 10 == 1 && floor($n / 10) % 10 != 1) { $ret = $words[0]; } elseif($n % 10 >= 1 && $n % 10 <= 4 && floor($n / 10) % 10 != 1) { $ret = $words[1]; } else { $ret = $words[2]; } assert($ret != ''); return $ret; } /** Число от 0 до 999999999. @param n:int - число @param gender:boolean, default true - возвращать мужской род (сорок один) или женский (сорок одна). @return:string - строковые представление числа */ private static function num2string($n, $gender = true) { $ret = ''; if($n == 0) { $ret = 'ноль '; } else { if($millions = (floor($n / 1000000) % 1000)) { $ret .= CostConverter::num2str1_999($millions, true); $ret .= CostConverter::magick_ending($millions, array('миллион', 'миллиона', 'миллионов')); $ret .= ' '; } if($thousands = (floor($n / 1000) % 1000)) { $ret .= CostConverter::num2str1_999($thousands, false); $ret .= CostConverter::magick_ending($thousands, array('тысяча', 'тысячи', 'тысяч')); $ret .= ' '; } if($ones = ($n % 1000)) { $ret .= CostConverter::num2str1_999($ones, $gender); } } assert($ret != ''); return $ret; } public static function rub2string($n) { $ret = CostConverter::num2string($n, true); $ret .= CostConverter::magick_ending($n, array('рубль', 'рубля', 'рублей')); return $ret; } public static function kop2string($n) { $ret = $n." "; $ret .= CostConverter::magick_ending($n, array('копейка', 'копейки', 'копеек')); return $ret; } ?>