Перейти к содержимому


Количество и сумма прописью


Сообщений в теме: 3

#1 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 435 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 10 Январь 2016 - 21:49

Часто приходится сталкиваться с необходимость писать в формах количество или сумму прописью. Порылся в сети. Немного адаптировал для универсальности. Вуаля!

1. Создаем внешний файл propis.php, чтобы не загромождать код. При необходимости использовать функцию, просто подключаем его в коде страницы:

require_once "propis.php";

2. Во внешний файл propis.php заливаем этот код:

<?

function propis($rub,$val)
{
// $val - валюта, записывается в первые три массива: 0-шт,1-руб,2-долларов,3-евро
if ($val==0) {
$dop0 = Array("","тысяч","миллионов","миллиардов");
$dop1 = Array("","тысяча","миллион","миллиард");
$dop2 = Array("","тысячи","миллиона","миллиарда");
}
if ($val==1) {
$dop0 = Array("рублей","тысяч","миллионов","миллиардов");
$dop1 = Array("рубль","тысяча","миллион","миллиард");
$dop2 = Array("рубля","тысячи","миллиона","миллиарда");
}
if ($val==2) {
$dop0 = Array("долларов","тысяч","миллионов","миллиардов");
$dop1 = Array("доллар","тысяча","миллион","миллиард");
$dop2 = Array("доллара","тысячи","миллиона","миллиарда");
}
if ($val==3) {
$dop0 = Array("евро","тысяч","миллионов","миллиардов");
$dop1 = Array("евро","тысяча","миллион","миллиард");
$dop2 = Array("евро","тысячи","миллиона","миллиарда");
}

$s1 = Array("","один","два","три","четыре","пять","шесть","семь","восемь","девять");
$s11 = Array("","одна","две","три","четыре","пять","шесть","семь","восемь","девять");
$s2 = Array("","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто");
$s22 = Array("десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать");
$s3 = Array("","сто","двести","триста","четыреста");

if($rub==0)
{// если это 0
return "ноль ".$dop0[0];
}

// разбиваем полученное число на тройки и загоняем в массив $triplet
$t_count = ceil(strlen($rub)/3);
for($i=0;$i<$t_count;$i++)
{
$k = $t_count - $i - 1;
$triplet[$k] = $rub%1000;
$rub = floor($rub/1000);
}

// пробегаем по триплетам
for($i=0;$i<$t_count;$i++)
{
$t = $triplet[$i]; // это текущий триплет - с ним и работаем
$k = $t_count - $i - 1;
$n1 = floor($t/100);
$n2 = floor(($t-$n1*100)/10);
$n3 = $t-$n1*100-$n2*10;

// обрабатываем сотни
if($n1<5) $res .= $s3[$n1]." ";
elseif($n1) $res .= $s1[$n1]."сот ";

if($n2>1)
{// второй десяток
$res .= $s2[$n2]." ";
if($n3 and $k==1)
{// если есть единицы в триплете и это триплет ТЫСЯЧ
$res .= $s11[$n3]." ";
}
elseif($n3)
{
$res .= $s1[$n3]." ";
}
}
elseif($n2==1)
{
$res .= $s22[$n3]." ";
}
elseif($n3 and $k==1)
{// если есть единицы в триплете и это триплет ТЫСЯЧ
$res .= $s11[$n3]." ";
}
elseif($n3)
{
$res .= $s1[$n3]." ";
}

// прилепляем в конец триплета коммент
if($n3==1 and $n2!=1)
{// в конце триплета стоит 1, но не 11.
$res .= $dop1[$k]." ";
}
elseif($n3>1 and $n3<5 and $n2!=1)
{// в конце триплета стоит 2, 3 или 4, но не 12, 13 или 14
$res .= $dop2[$k]." ";
}
elseif($t or $k==0)
{
$res .= $dop0[$k]." ";
}
}
return $res;
}
?>

3. Если нам нужно вывести число прописью (для указания штук, например), пишем такую формулу:

$html=propis($rub,0);
echo $html; 

здесь первая переменная - число, которое нужно вывести прописью

4. Если нам нужно вывести сумму в рублях, то пишем такую формулу:


$html=propis($rub,1);
echo $html; 

5. Если в долларах, то такую:


$html=propis($rub,2);
echo $html; 


6. Если в евро, то такую:

$html=propis($rub,3);
echo $html; 

В принципе, если посмотреть на код, то его легко адаптировать хоть к тугрикам, хоть к юаням :-)

Удачного использования!

Сообщение отредактировал Александр Пономарев: 20 Январь 2016 - 14:16


#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 11 Январь 2016 - 11:24

А чем вас не устраивает уже встроенная в программу функция прописи, не совсем понял?

#3 Александр Пономарев

    Активный участник

  • Пользователи
  • PipPipPip
  • 435 сообщений
  • Пол:Мужчина
  • Город:Таганрог

Отправлено 20 Январь 2016 - 14:16

А как она называется и где описана?

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 20 Январь 2016 - 15:17

https://clientbase.r...?showtopic=4960 например





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных