Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#1: 2016-10-11 19:20:20 ЛС | профиль | цитата
Пример подключения и использования функции SumProp

Редактировалось 2 раз(а), последний 2016-10-11 19:24:00
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 16884
Рейтинг: 1239
#2: 2016-10-12 10:46:47 ЛС | профиль | цитата
Добавлено 12.10.2016
1. Обработка отрицательных сумм
2. Обработка сумм вида 0.0
3. Устранена ошибка при выводе суммы в 2000000, 2000000000


4. Добавлено склонение слов "рубль", "копейка" (не нравятся мне "руб." и "коп.")

Add(InlineCode,14378720,287,294)
{
@Hint=#15:Функция SumProp|
WorkPoints=#11:addFunction|
DataPoints=#8:dbHandle|
Code=#15:unit HiAsmUnit;|24:// Author Tad 12.03.2011|37:// Данные ограничены значением MAXINT|2://|23:// Добавлено 12.10.2016|34:// 1. Обработка отрицательных сумм|29:// 2. Обработка сумм вида 0.0|61:// 3. Устранена ошибка при выводе суммы в 2000000, 2000000000|2://|2://|0:|9:interface|0:|52:uses kol,Share,Debug,Windows,SQLite3Api,hiSQLite_DB;|0:|4:type|28: THiAsmClass = class(TDebug)|9: public|22: dbHandle:THI_Event;|52: procedure addFunction(var _Data:TData; idx:word);|5: end;|5:const|130: sEd: array[1..19] of string = ('один ', 'два ', 'три ', 'четыре ', 'пять ', 'шесть ', 'семь ', 'восемь ', 'девять ', 'десять ', |129: 'одиннадцать ', 'двенадцать ', 'тринадцать ', 'четырнадцать ', 'пятнадцать ', 'шестнадцать ', |84: 'семнадцать ', 'восемнадцать ', 'девятнадцать ');|50: sEd1: array[1..2] of string = ('одна ', 'две ');|142: sDes: array[2..9] of string = ('двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ', 'семьдесят ', 'восемьдесят ', 'девяносто ');|142: sSot: array[1..9] of string = ('сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ', 'семьсот ', 'восемьсот ', 'девятьсот ');|70: S0: array[1..3] of string = ('тысяч ', 'миллионов ', 'миллиардов ');|67: S1: array[1..3] of string = ('тысяча ', 'миллион ', 'миллиард ');|69: S2: array[1..3] of string = ('тысячи ', 'миллиона ', 'миллиарда ');|2: |14:implementation|0:|65:procedure myFunc(ctx:pointer; nArg:integer; args:ppvalue); cdecl;|0:|47:function dimension(N:integer):string; overload;|5:begin|11: case N of|29: 1: Result := 'рубль ';|29: 2..4: Result := 'рубля ';|30: else Result := 'рублей ';|6: end;|4:end;|0:|63:{--------------- преобразование триады в строку -------------}|47:var Rub3, RubI, RubK, Des, LastDes, T: longint;|42: Sto, Kop, Res, Znak, RazR, RazK: string;|13: Rub:double;|5:begin|49: Znak := ''; Res := ''; RazR := ''; RazK := '';|37: Rub := sqlite3_value_double(args^);|59: if Rub<0 then begin Rub := Rub*-1; Znak := 'МИНУС '; end;|22: RubI := Trunc(Rub); |36: RubK := Round((Rub - RubI) * 100);|9: T := 0;|19: WHILE RubI > 0 do |7: BEGIN|45: Rub3 := RubI mod 1000; // младшая триада|40: RubI := RubI div 1000; // оставшися|14: Sto := '';|19: If Rub3<>0 then |8: Begin|66: if (Rub3 mod 100) < 20 then //число из двух последних цифр <20|37: begin // ДА|29: LastDes := Rub3 mod 20;|25: if LastDes > 0 then|14: begin|53: if (T = 0) then Sto := dimension(LastDes);|109: if (T = 1) and (LastDes in [1..2]) then Sto := sEd1[LastDes] + Sto else Sto := sEd[LastDes] + Sto;|14: end; |27: Rub3 := Rub3 div 100;|8: end |4: |20: else // НЕТ > |4: |9: begin|29: LastDes := Rub3 mod 10;|25: if LastDes > 0 then|14: begin|53: if (T = 0) then Sto := dimension(LastDes);|109: if (T = 1) and (LastDes in [1..2]) then Sto := sEd1[LastDes] + Sto else Sto := sEd[LastDes] + Sto;|15: end; |26: Rub3 := Rub3 div 10;|25: Des := Rub3 mod 10;|45: if Des > 0 then Sto := sDes[Des] + Sto;|26: Rub3 := Rub3 div 10;|8: end;|4: |45: if Rub3 > 0 then Sto := sSot[Rub3] + Sto;|18: if T > 0 then |9: begin|44: if LastDes = 1 then Sto := Sto + S1[T]|11: else |75: if LastDes in [2..4] then Sto := Sto + S2[T] else Sto := Sto + S0[T];|8: end;|64: End else If (T=0) then Sto := 'рублей '; // конец If Rub3<>0 |15: T := T + 1;|21: Res := Sto + Res;|28: END; // конец цикла While|1: |42: //======== склоняем копейки =============|21: RazK := ' копеек.';|32: If Not(RubK in [11..19]) then|22: case RubK mod 10 of|26: 1: RazK:=' копейка.';|29: 2..4: RazK:=' копейки.';|7: end;|47://======================================== |30: Kop := Int2Str(RubK mod 10);|22: RubK := RubK div 10;|29: Kop := Int2Str(RubK) + Kop;|85: If Res<>'' then Res := Znak + Res + Kop + RazK else Res:= Znak + Res + Kop + RazK;|27: CharUpperBuff(@Res[1],1);|66: sqlite3_result_text(ctx,PChar(Res),Length(Res),SQLITE_TRANSIENT);|4:end;|0:|34:procedure THiAsmClass.addFunction;|13:var dt:TData;|5:begin|37: dt := ReadData(_Data,dbHandle,nil);|36: if _IsObject(dt,SQLite_GUID) then |92: sqlite3_create_function(ToObject(dt),PChar('SumProp'),1,SQLITE_ANY,nil,@myFunc,nil,nil);|4:end;|0:|4:end.|
AddHint(-114,-26,107,13,@Hint)
}


Редактировалось 1 раз(а), последний 2016-10-12 20:58:47
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1sum_in_words_2.rar [2.3KB] [510]
2
Сообщение
...
Прикрепленные файлы
(файлы не залиты)