Сумма прописью с копейками цифрами

Здравствуйте Террасофт!

В созданном "ФастРепорт" отчете реализована функция подстановки суммы прописью, следующим образом:

var
  ConvertUtils, CurrencyUtils: Variant;
   
procedure memSummaOnBeforePrint(Sender: TfrxComponent);
var
  Amount: String;
  AmountInStr: String;
begin
  Amount := FloatToStr(SUM(,ddOffering));
  AmountInStr := ConvertUtils.ScriptControl.CodeObject.AmountToStr(Amount, 'ru', 'RUB');                
  memSumma.Text := AmountInStr;  
end;

procedure frxReportOnStartReport(Sender: TfrxComponent);
var
  Connector: Variant;                                
begin
  Connector := ds_ReportInvoiceWithNDSForRussia11.GetConnector();
  ConvertUtils := Connector.Services.GetNewItemByUSI('scr_ConvertUtils');
  CurrencyUtils := Connector.Services.GetNewItemByUSI('scr_CurrencyUtils');          
end;

begin

end.

Подскажите как реализовать подстановку копеек цифрами, а остальное оставить, как было, буквами?

Нравится

7 комментариев

Игорь, могу сказать, что у нас это рализовано, возможно, не самым оптимальным методом, поскольку дорабатывался этот функционал на заре знакомства с системой, но работает так:

function PartAmountInCurrencyToString(Dataset, SumString, UE, UEkopek, ValUE, ValUEkopek){
	var kopekString = SumString.substring(SumString.lastIndexOf(UEkopek),SumString.length);
	var rubleString = SumString.substring(SumString.lastIndexOf(UE),SumString.length);
    rubleString = rubleString.substring(0,rubleString.indexOf(' '));
 
	var rubleValSring = SumString.substring(0,SumString.indexOf(UE) - 1);
	Dataset.Values('SumString') = rubleValSring + ' ' +
	rubleString + ' ' + ValUEkopek + ' ' + kopekString;
}

В качестве SumString передается то, что у Вас лежит в AmountInStr. Затем происходит запись непосредственно в Датасет... Вы можете использовать просто переменную...

По другим параметрам:
пример вызова PartAmountInCurrencyToString(Dataset,SumString, 'руб', 'коп', ruble, kopek);
при этом

			//Рубли и копейки
		    var fullSum = Dataset.ValAsStr('Amount') 
			if(fullSum.lastIndexOf(",") == -1){
		 		fullSum = fullSum + ',00';
			}
			//если "круглое" число копеек
	    	if(fullSum.lastIndexOf(",") == fullSum.length - 2){
		  	fullSum = fullSum + '0';
			}
			var ruble =  fullSum.substring(0,fullSum.lastIndexOf(","));
			var kopek = fullSum.substring(fullSum.length - 2,fullSum.length);

Надеюсь, помогла :)

Для того, чтобы внести данные изменения, необходимо откорректировать скрипт scr_ConvertUtils:

Найдите строку

ko = Propis(price = kop, CurrencyOperations.K);

и замените ее на строку

ko = CurrencyOperations.K + " копеек";

Благодарю за ответы!
Алёна ваш метод достаточно трудоемок, если не найдется более простого примера обязательно воспользуюсь вашим, отдельная вам благодарность.

Анна пример предложенный вами не работает, скрипт срабатывает, но в результате вместо копеек цифрами, много раз повторяется слово:"копеек" в разных падежах.

"Alimova Anna" написал:Для того, чтобы внести данные изменения, необходимо откорректировать скрипт scr_ConvertUtils

Анна, а если в другом месте понадобится все строкой? Мы именно из этих соображений не стали менять основной скрипт, потому что в одном месте копейки нужны цифрами, а в другом прописью...

Игорь, в таком случае попробуйте заменить скрипт scr_ConvertUtils на скрипт в приложении.

Что менялось: в функции Propis добавлен фрагмент кода

	    if(D == CurrencyOperations.K){
        	litera = price + ' ' + edinicy.split(/[\s\!,\.\?]+/g).pop();
			return litera;
        }

и в следующем фрагменте

	ko != '' ? res = ru + ' ' + ko: res = ru;
	if (CurrencyOperations.Language == 'ru') {
		ru == 'Ноль ' + CurrencyOperations.R[0] && ko != ''? res = ko: 0;
		kop == 0? res += ' ноль ' + CurrencyOperations.K[0]: 0;
	} else {
		ru == 'Нуль ' + CurrencyOperations.R[0] && ko != ''? res = ko: 0;
		kop == 0? res += ' нуль ' + CurrencyOperations.K[0]: 0;
	}

заменены строки ' ноль ' на цифру.

Алена, если Вас в разных отчетах нужно по-разному отображать копейки, тогда имеет смысл модифицировать функцию Propis:
1. Добавить в нее дополнительный параметр - копейки цифрами или буквами
2. Вызывать добавленный мною фрагмент кода по условию kopnum == true

	    if((D == CurrencyOperations.K)&&(kopnum == true)){
        	litera = price + ' ' + edinicy.split(/[\s\!,\.\?]+/g).pop();
			return litera;
        }

Аналогично поступить с фрагментом кода 0 копеек

Анна спасибо вам, теперь все работает как надо. До конца только не понял, как пользоваться этим:
-----------------------
Алена, если Вас в разных отчетах нужно по-разному отображать копейки, тогда имеет смысл модифицировать функцию Propis:
1. Добавить в нее дополнительный параметр - копейки цифрами или буквами
2. Вызывать добавленный мною фрагмент кода по условию kopnum == true

if((D == CurrencyOperations.K)&&(kopnum == true)){
litera = price + ' ' + edinicy.split(/[\s\!,\.\?]+/g).pop();
return litera;
}
Аналогично поступить с фрагментом кода 0 копеек
---------------------------------------------

Видимо вызов: "ConvertUtils.ScriptControl.CodeObject.AmountToStr(Amount, 'ru', 'RUB');" будет видоизменен? Если да то подскажите как? Если нет, получается, необходимо отлавливать отчет в котором запускается этот скрипт?

Анна, спасибо! Интересный вариант :) Вносить изменения в функцию побоялись по той причине, что "мало ли где еще она вызывается"

Показать все комментарии