<?php
class CostConverter
{
/*
Число от 10 до 19.
*/
private static function num2str10_19($n)
{
assert($n >= 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;
}
?>