FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9212
Вход
Денежная сумма прописью. Довольно короткий вариант.

Сумма прописью. Придумал этот алгоритм после мучений с книжным примером.


 
Прислал: Asws   Категория: Разное


  
 ********************************************************************************************  
 *  СУММА ПРОПИСЬЮ	Visual	FoxPro  
 *  
 * Принимает число от 0 до 999'999'999'999,99  
 * Возвращает текстовую строку с суммой в рублях  
 *  
 * Если число отрицательное, то берет модуль числа.  
 * По желании не сложно доработать, чтобы второй параметр указывал тип валюты,  
 * и вместо "рублей" и "копеек" подставлять соответствующие слова.  
 *  
 * Оптимизация по скорости для многократного вызова в цикле не проводилась.  
 ********************************************************************************************  
    
  FUNCTION	Sum_Str  
  PARAMETERS	nSum  
  LOCAL	cRet,AswCounter,AswS,Asw,Asw1  
    
  cRet=""  
  nSum=iif(empty(nSum),0,abs(nSum))  
    
  AswS=str(nSum,15,2)  
  FOR	AswCounter=1	to	10	STEP	3  
  	Asw=substr(AswS,AswCounter,3)  
  	if	Asw#space(3)  
  		Asw1=""  
  		do	case  
  			case	substr(Asw,1,1)="1"  
  				Asw1="сто "  
  			case	substr(Asw,1,1)="2"  
  				Asw1="двести "  
  			case	substr(Asw,1,1)="3"  
  				Asw1="триста "  
  			case	substr(Asw,1,1)="4"  
  				Asw1="четыреста "  
  			case	substr(Asw,1,1)="5"  
  				Asw1="пятьсот "  
  			case	substr(Asw,1,1)="6"  
  				Asw1="шестьсот "  
  			case	substr(Asw,1,1)="7"  
  				Asw1="семьсот "  
  			case	substr(Asw,1,1)="8"  
  				Asw1="восемьсот "  
  			case	substr(Asw,1,1)="9"  
  				Asw1="девятьсот "  
  		endcase  
  		cRet=cRet+Asw1  
  		Asw1=""  
  		if	substr(Asw,2,1)="1"  
  			do	case  
  				case	substr(Asw,3,1)="0"  
  					Asw1="десять "  
  				case	substr(Asw,3,1)="1"  
  					Asw1="одиннадцать "  
  				case	substr(Asw,3,1)="2"  
  					Asw1="двенадцать "  
  				case	substr(Asw,3,1)="3"  
  					Asw1="тринадцать "  
  				case	substr(Asw,3,1)="4"  
  					Asw1="четырнадцать "  
  				case	substr(Asw,3,1)="5"  
  					Asw1="пятнадцать "  
  				case	substr(Asw,3,1)="6"  
  					Asw1="шестнадцать "  
  				case	substr(Asw,3,1)="7"  
  					Asw1="семнадцать "  
  				case	substr(Asw,3,1)="8"  
  					Asw1="восемнадцать "  
  				case	substr(Asw,3,1)="9"  
  					Asw1="девятнадцать "  
  			endcase  
  			cRet=cRet+Asw1  
  			do	case  
  				case	AswCounter=1  
  					cRet=cRet+"миллиардов "  
  				case	AswCounter=4  
  					cRet=cRet+"миллионов "  
  				case	AswCounter=7  
  					cRet=cRet+"тысяч "  
  				case	AswCounter=10  
  					cRet=cRet+"рублей "  
  			endcase  
  		else  
  			do	case  
  				case	substr(Asw,2,1)="2"  
  					Asw1="двадцать "  
  				case	substr(Asw,2,1)="3"  
  					Asw1="тридцать "  
  				case	substr(Asw,2,1)="4"  
  					Asw1="сорок "  
  				case	substr(Asw,2,1)="5"  
  					Asw1="пятьдесят "  
  				case	substr(Asw,2,1)="6"  
  					Asw1="шестьдесят "  
  				case	substr(Asw,2,1)="7"  
  					Asw1="семьдесят "  
  				case	substr(Asw,2,1)="8"  
  					Asw1="восемьдесят "  
  				case	substr(Asw,2,1)="9"  
  					Asw1="девяносто "  
  			endcase  
  			cRet=cRet+Asw1  
  			Asw1=""  
  			do	case  
  				case	substr(Asw,1,3)="000"  
  					Asw1=iif(AswCounter=10,"рублей ","")  
  				case	substr(Asw,3,1)="0"	.and.	substr(Asw,1,3)#"000"  
  					Asw1=iif(AswCounter=7,"тысяч ",		;  
  					 iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))  
  				case	substr(Asw,3,1)="1"  
  					Asw1=iif(AswCounter=7,"одна тысяча ",	;  
  					 "один "+iif(AswCounter=1,"миллиард ",iif(AswCounter=4,"миллион ","рубль ")))  
  				case	substr(Asw,3,1)="2"  
  					Asw1=iif(AswCounter=7,"две тысячи ",	;  
  					 "два "+iif(AswCounter=1,"миллиарда ",iif(AswCounter=4,"миллиона ","рубля ")))  
  				case	substr(Asw,3,1)="3"  
  					Asw1=iif(AswCounter=7,"три тысячи ",	;  
  					 "три "+iif(AswCounter=1,"миллиарда ",iif(AswCounter=4,"миллиона ","рубля ")))  
  				case	substr(Asw,3,1)="4"  
  					Asw1=iif(AswCounter=7,"четыре тысячи ",	;  
  					 "четыре "+iif(AswCounter=1,"миллиарда ",iif(AswCounter=4,"миллиона ","рубля ")))  
  				case	substr(Asw,3,1)="5"  
  					Asw1=iif(AswCounter=7,"пять тысяч ",	;  
  					 "пять "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))  
  				case	substr(Asw,3,1)="6"  
  					Asw1=iif(AswCounter=7,"шесть тысяч ",	;  
  					 "шесть "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))  
  				case	substr(Asw,3,1)="7"  
  					Asw1=iif(AswCounter=7,"семь тысяч ",	;  
  					 "семь "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))  
  				case	substr(Asw,3,1)="8"  
  					Asw1=iif(AswCounter=7,"восемь тысяч ",	;  
  					 "восемь "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))  
  				case	substr(Asw,3,1)="9"  
  					Asw1=iif(AswCounter=7,"девять тысяч ",	;  
  					 "девять "+iif(AswCounter=1,"миллиардов ",iif(AswCounter=4,"миллионов ","рублей ")))  
  			endcase  
  			cRet=cRet+Asw1  
  		endif  
  	endif  
  ENDFOR  
  AswS=substr(AswS,14,2)  
    
  if	substr(AswS,1,1)="1"	.or.	substr(AswS,2,1)="0"  
  	cRet=cRet+AswS+" копеек"  
  else  
  	do	case  
  		case	substr(AswS,2,1)>"4"  
  			cRet=cRet+AswS+" копеек"  
  		case	substr(AswS,2,1)="1"  
  			cRet=cRet+AswS+" копейка"  
  		case	substr(AswS,2,1)>"1"	.and.	substr(AswS,2,1)<"5"  
  			cRet=cRet+AswS+" копейки"  
  	endcase  
  endif  
  cRet=upper(substr(cRet,1,1))+substr(cRet,2)  
  if	nSum<1  
  	cRet="Ноль "+cRet  
  endif  
  return	cRet  
  

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (3.4) Вложение [1.26]kb
Дополнения пользователей
Денежная сумма прописью. Довольно короткий вариант.
[+][?]
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика