Пятница, 26.04.2024
TiM
Меню сайта
Категории раздела
Мои статьи [9]
1С Бухгалтерия [1]
Arduino / ATMEGA [10]
ESP8266 [1]
OrangePi PC и Raspberry Pi 2 Model B V1.1 [4]
Шаговые двигатели [1]
PHPProBid [0]
CMS DLE (DataLife Engine) [0]
CMS Joomla [13]
SugarCRM [5]
Базы данных [5]
PHP скрипты [16]
Bash и скрипты [27]
IP АТС Elastix / Asterisk [12]
CentOS [6]
Debian [8]
Lubuntu / LinuxMINT [29]
Windows [28]
Умный дом [1]
Сервера [16]
Natural Selection [1]
System Shock 2 [1]
Форма входа
Главная » Статьи » PHP скрипты

PHP: сумма(стоимость) прописью

Очень часто возникает необходимость конвертировать числовое значение стоимости в текстовую запись, что-бы сумма выводилась прописью, например было так: 1543.11, а после конвертации стало так «одна тысяча пятьсот сорок три рубля 11 копеек». Такое решение может потребоваться на сайте интернет магазина, или при выводе отчетных документов на печать и так далее. Сегодня я хочу представить вашему вниманию скрипт, который позволяет произвести подобную конвертацию с учетом склонения словоформ.

/**
 * Сумма прописью
 * @author runcore
 * @url rche.ru
 */
function num2str($inn, $stripkop=false) {
 $nol = 'ноль';
 $str[100]= array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот', 'восемьсот','девятьсот');
 $str[11] = array('','десять','одиннадцать','двенадцать','тринадцать', 'четырнадцать','пятнадцать','шестнадцать','семнадцать', 'восемнадцать','девятнадцать','двадцать');
 $str[10] = array('','десять','двадцать','тридцать','сорок','пятьдесят', 'шестьдесят','семьдесят','восемьдесят','девяносто');
 $sex = array(
 array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),// m
 array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять') // f
 );
 $forms = array(
 array('копейка', 'копейки', 'копеек', 1), // 10^-2
 array('рубль', 'рубля', 'рублей', 0), // 10^ 0
 array('тысяча', 'тысячи', 'тысяч', 1), // 10^ 3
 array('миллион', 'миллиона', 'миллионов', 0), // 10^ 6
 array('миллиард', 'миллиарда', 'миллиардов', 0), // 10^ 9
 array('триллион', 'триллиона', 'триллионов', 0), // 10^12
 );
 $out = $tmp = array();
 // Поехали!
 $tmp = explode('.', str_replace(',','.', $inn));
 $rub = number_format($tmp[ 0], 0,'','-');
 if ($rub== 0) $out[] = $nol;
 // нормализация копеек
 $kop = isset($tmp[1]) ? substr(str_pad($tmp[1], 2, '0', STR_PAD_RIGHT), 0,2) : '00';
 $segments = explode('-', $rub);
 $offset = sizeof($segments);
 if ((int)$rub== 0) { // если 0 рублей
 $o[] = $nol;
 $o[] = morph( 0, $forms[1][ 0],$forms[1][1],$forms[1][2]);
 }
 else {
 foreach ($segments as $k=>$lev) {
 $sexi= (int) $forms[$offset][3]; // определяем род
 $ri = (int) $lev; // текущий сегмент
 if ($ri== 0 && $offset>1) {// если сегмент==0 & не последний уровень(там Units)
 $offset--;
 continue;
 }
 // нормализация
 $ri = str_pad($ri, 3, '0', STR_PAD_LEFT);
 // получаем циферки для анализа
 $r1 = (int)substr($ri, 0,1); //первая цифра
 $r2 = (int)substr($ri,1,1); //вторая
 $r3 = (int)substr($ri,2,1); //третья
 $r22= (int)$r2.$r3; //вторая и третья
 // разгребаем порядки
 if ($ri>99) $o[] = $str[100][$r1]; // Сотни
 if ($r22>20) {// >20
 $o[] = $str[10][$r2];
 $o[] = $sex[ $sexi ][$r3];
 }
 else { // <=20
 if ($r22>9) $o[] = $str[11][$r22-9]; // 10-20
 elseif($r22> 0) $o[] = $sex[ $sexi ][$r3]; // 1-9
 }
 // Рубли
 $o[] = morph($ri, $forms[$offset][ 0],$forms[$offset][1],$forms[$offset][2]);
 $offset--;
 }
 }
 // Копейки
 if (!$stripkop) {
 $o[] = $kop;
 $o[] = morph($kop,$forms[ 0][ 0],$forms[ 0][1],$forms[ 0][2]);
 }
 return preg_replace("/\s{2,}/",' ',implode(' ',$o));
}
 
/**
 * Склоняем словоформу
 */
function morph($n, $f1, $f2, $f5) {
 $n = abs($n) % 100;
 $n1= $n % 10;
 if ($n>10 && $n<20) return $f5;
 if ($n1>1 && $n1<5) return $f2;
 if ($n1==1) return $f1;
 return $f5;
}

Потестировать работу скрипта можно, по следующему запросу

http://rche.ru/api/convert/1245.13

где 1245.13 сумма которую необходимо конвертировать.

 

Источник: http://rche.ru/2068_skript-php-summastoimost-propisyu.html

Категория: PHP скрипты | Добавил: Timur (22.04.2016)
Просмотров: 1315
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
YANDEX
Яндекс.Метрика
Сайты
  • Харьковский Юридический Альянс
  • Оцифровка кинопленки
  • TiM ©
    Харьков 2024