Сумма прописью на PHP
Сумма прописью на PHP
В соответствии с нормативными актами, регламентирующими порядок работы с бухгалтерскими документами, при заполнении многих унифицированных форм сумма указывается не только числами, но и прописью. Формат записи принят следующий: рублевая часть суммы указывается прописью в именительном падеже с заглавной буквы, а копейки обозначаются цифрами. При автоматической генерации документов на PHP с цифровыми выражениями проблем в принципе не возникает, а для преобразования чисел в сумму прописью я уже давно написал и использую вот такую функцию.
В процессе преобразования используется функция для склонения числительных, о которой я писал в одной из предыдущих статей. Параметры ее вызова и особенности вы можете посмотреть там же, здесь я это дублировать не буду.
Code (PHP) : Убрать нумерацию
- //--------------------------------------------------------
- // Функция для склонения числительных
- //--------------------------------------------------------
- function num2word($n,$words) {
- return ($words[($n=($n=$n%100)>19?($n%10):$n)==1?0 : (($n>1&&$n<=4)?1:2)]);
- }
Code (PHP) : Убрать нумерацию
- //--------------------------------------------------------
- // Функция для преобразования числа в сумму прописью
- //--------------------------------------------------------
- // Автор: ManHunter / PCL (www.manhunter.ru)
- //--------------------------------------------------------
- function sum2words($n) {
- $words=array(
- 900=>'девятьсот',
- 800=>'восемьсот',
- 700=>'семьсот',
- 600=>'шестьсот',
- 500=>'пятьсот',
- 400=>'четыреста',
- 300=>'триста',
- 200=>'двести',
- 100=>'сто',
- 90=>'девяносто',
- 80=>'восемьдесят',
- 70=>'семьдесят',
- 60=>'шестьдесят',
- 50=>'пятьдесят',
- 40=>'сорок',
- 30=>'тридцать',
- 20=>'двадцать',
- 19=>'девятнадцать',
- 18=>'восемнадцать',
- 17=>'семнадцать',
- 16=>'шестнадцать',
- 15=>'пятнадцать',
- 14=>'четырнадцать',
- 13=>'тринадцать',
- 12=>'двенадцать',
- 11=>'одиннадцать',
- 10=>'десять',
- 9=>'девять',
- 8=>'восемь',
- 7=>'семь',
- 6=>'шесть',
- 5=>'пять',
- 4=>'четыре',
- 3=>'три',
- 2=>'два',
- 1=>'один',
- );
- $level=array(
- 4=>array('миллиард', 'миллиарда', 'миллиардов'),
- 3=>array('миллион', 'миллиона', 'миллионов'),
- 2=>array('тысяча', 'тысячи', 'тысяч'),
- );
- list($rub,$kop)=explode('.',number_format($n,2));
- $parts=explode(',',$rub);
- for($str='', $l=count($parts), $i=0; $i<count($parts); $i++, $l--) {
- if (intval($num=$parts[$i])) {
- foreach($words as $key=>$value) {
- if ($num>=$key) {
- // Fix для одной тысячи
- if ($l==2 && $key==1) {
- $value='одна';
- }
- // Fix для двух тысяч
- if ($l==2 && $key==2) {
- $value='две';
- }
- $str.=($str!=''?' ':'').$value;
- $num-=$key;
- }
- }
- if (isset($level[$l])) {
- $str.=' '.num2word($parts[$i],$level[$l]);
- }
- }
- }
- if (intval($rub=str_replace(',','',$rub))) {
- $str.=' '.num2word($rub,array('рубль', 'рубля', 'рублей'));
- }
- $str.=($str!=''?' ':'').$kop;
- $str.=' '.num2word($kop,array('копейка', 'копейки', 'копеек'));
- return mb_strtoupper(mb_substr($str,0,1,'utf-8'),'utf-8').
- mb_substr($str,1,mb_strlen($str,'utf-8'),'utf-8');
- }
Code (PHP) : Убрать нумерацию
- // Три миллиона девятьсот одиннадцать тысяч семьсот шестьдесят рублей 10 копеек
- echo sum2words(3911760.10);
- // Двадцать семь рублей 00 копеек
- echo sum2words(27);
- // Девяносто пять миллиардов одна тысяча рублей 42 копейки
- echo sum2words(95000001000.42);
- // 15 копеек
- echo sum2words(0.15);
Просмотров: 6630 | Комментариев: 7
Метки: PHP, полезные функции
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Владислав
(27.11.2019 в 21:12):
Спасибо, работает!
ManHunter
(04.10.2019 в 18:43):
Поправил, спасибо
ivan
(04.10.2019 в 18:42):
Неточность в 40 строке:должно быть 4=>'четыре'
было "Сто семьдесят три одна тысячи" у 174000
было "Сто семьдесят три одна тысячи" у 174000
ManHunter
(16.11.2017 в 12:06):
Действительно. Поправил, спасибо!
johser
(16.11.2017 в 11:53):
Заметил 2 неточности:
1. на 60 строке должно быть $l==2
2. нужно добить фикс для 2 тысяч, иначе
echo sum2words(2000); // Два тысячи рублей 00 копеек
1. на 60 строке должно быть $l==2
2. нужно добить фикс для 2 тысяч, иначе
echo sum2words(2000); // Два тысячи рублей 00 копеек
ManHunter
(09.08.2017 в 17:15):
И? Пятьдесят семь тысяч четыреста восемьдесят два рубля 00 копеек
smaragdus
(09.08.2017 в 17:10):
57482
Добавить комментарий
Заполните форму для добавления комментария