<?PHP
class CPriceOfWords
{
// сообщение об ошибке
var $errorMassage = '';
function convert($price, $valName = 'руб.', $monName = 'коп.', $sexExchange = true)
{
$this->errorMassage = '';
// возвращаемая строка
$retStr = "";
if (!is_numeric($price)) // проверка входных данных {
$this->errorMassage="входные данные '$price' не являются числом";
return false;
}
if ((0 + $price) < 0)
$this->errorMassage="отрицательные числа берутся по модулю!";
if ($integralPart == 0)
{
$retStr.= "ноль ";
$this->errorMassage = "ok";
}
if ($integralPart >= 1000000) // проверка на количество символов
{
$this->errorMassage="количество символов в целой части числа более шести!";
return false;
}
$thousands = floor($integralPart/1000
.); $one = $integralPart - $thousands * 1000;
// echo " $thousands - $one<br>";
if ($thousands)
$retStr.= $this->convertThreeNumbers($thousands,false,'тысяч','тысячи','тысяча');
if ($one)
$retStr.= $this->convertThreeNumbers($one,$sexExchange,'','','');
$retStr.= $valName." ";
$retStr.= '0';
$retStr.= round(($price-floor($price))*100)." $monName";
return $retStr;
}
// функция распарсивает трех злачное число
// параметры: $numbers - трехзначное число (можно меньше но не больше)))
// $sex - пол Ме или Жо например: тысяча это женский пол, рубль - это мужской пол, и для правильного true/false
// окончания надо корректно задавать пол.
// $mPlural - множественное название: тысяч, миллионов, миллиардов ....
// $plural - уменьшительное название множественного варианта (родительский падеж): миллиона, тысячи, миллиарда
// $single - в единичном числе: рубль, тысяча, миллион, ...
function convertThreeNumbers($numbers,$sex,$mPlural,$plural,$single)
{
$retStr = '';
// echo " - $numbers <br>";
if (!$numbers)
return false;
// получаем цифру для сотень
$hundreds = floor($numbers/100
.); switch ($hundreds) // сотни
{
case 1: $retStr.='сто '; break;
case 2: $retStr.='двести '; break;
case 3: $retStr.='триста '; break;
case 4: $retStr.='четыреста '; break;
case 5: $retStr.='пятьсот '; break;
case 6: $retStr.='шестьсот '; break;
case 7: $retStr.='семьсот '; break;
case 8: $retStr.='восемьсот '; break;
case 9: $retStr.='девятьсот '; break;
default: $retStr.='';break;
}
// определяем что у нас есть из десяток и единиц
$tens = $numbers - $hundreds*100;
if ($tens>19 or $tens<10)
{ // разбиваем на десятки и единицы
$one = $tens - (floor($tens/10
.)*10
); $tens = floor($tens/10
.);
switch ($tens) // десятки
{
case 2: $retStr.="двадцать "; break;
case 3: $retStr.="тридцать "; break;
case 4: $retStr.="сорок "; break;
case 5: $retStr.="пятьдесят "; break;
case 6: $retStr.="шестьдесят "; break;
case 7: $retStr.="семьдесят "; break;
case 8: $retStr.="восемдесят "; break;
case 9: $retStr.="девяносто "; break;
default: $retStr.="";break;
}
switch ($one) // единицы
{
// $plural,$single
case 1: if ($sex) $retStr.="один $single ";
else $retStr.="одна $single "; break;
case 2: if ($sex) $retStr.="два $plural ";
else $retStr.="две $plural "; break;
case 3: $retStr.="три $plural "; break;
case 4: $retStr.="четыре $plural "; break;
case 5: $retStr.="пять $mPlural "; break;
case 6: $retStr.="шесть $mPlural "; break;
case 7: $retStr.="семь $mPlural "; break;
case 8: $retStr.="восемь $mPlural "; break;
case 9: $retStr.="девять $mPlural "; break;
default: $retStr.="";break;
}
if ( ($hundreds!=0 or $tens!=0) and $one==0 )
$retStr.="$mPlural ";
}
else
{ // считаем как цельный кусок 10 -19
switch ($tens)
{
case 10: $retStr.="десять $mPlural "; break;
case 11: $retStr.="одиннадцать $mPlural "; break;
case 12: $retStr.="двенадцать $mPlural "; break;
case 13: $retStr.="тринадцать $mPlural "; break;
case 14: $retStr.="четырнадцать $mPlural "; break;
case 15: $retStr.="пятнадцать $mPlural "; break;
case 16: $retStr.="шестнадцать $mPlural "; break;
case 17: $retStr.="семнадцать $mPlural "; break;
case 18: $retStr.="восемнадцать $mPlural "; break;
case 19: $retStr.="девятнадцать $mPlural "; break;
default: $retStr.="";break;
}
}
return $retStr;
}
}
?>
<?PHP
if (isset($_POST['price'])) {
$indata = $_POST['price'];
$cPW = new CPriceOfWords();
echo "$indata == ";
if ($rez=$cPW->convert($indata,'грн.','коп.',false))
echo $rez;
else
echo "{$cPW->errorMassage}";
}
?>
<form action='' method='POST' >
<input type='text' name='price'>
<input type='submit'>
</form>