Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сумма прописью на другие языки, сумма прописью на другие языки 
V
    Опции темы
mr_tg
Дата 28.8.2012, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 29.3.2008

Репутация: нет
Всего: нет



Здраствуйте знатаки!
Delphi7 МодулЬ Суммы прописью
Код

{***********************************************************************}
{ Íåâèçóàëüíûé êîìïîíåíò äëÿ ïåðåâîäà äåíåæíîé åäèíèöû â ñóììó ïðîïèñüþ }
{ Àâòîð: Àëåêñàíäð Øàáëÿ, e-mail: [email protected]                     }
{***********************************************************************}
unit MInWord;

interface

uses
  SysUtils,
  Classes,
  stdctrls;

type
  TDigLevel = (lvlNone, lvlThousand, lvlMillion, lvlBillion);

type
  TInWord = class(TComponent)
  private
    {Private Declaration}
    FInWordList: TStringList;
    FText: String;
    FValue: Double;
    FMale: Boolean;
    FComma: ShortString;
    FLabel: TLabel;
    FFileName: TFileName;
    FSeparator: Char;
    procedure SetValue(NewValue: Double);
    procedure SetMale(AMale: Boolean);
    procedure SetComma(AComma: ShortString);
    procedure SetLabel(ALabel: TLabel);
    procedure SetSeparator(const Value: Char);
    procedure SetFileName(const Value: TFileName);
    function GetCurName: String;
  protected
    {Protected Declaration}
    function GetValue(Name: String; Count: Integer): String;
    function NumToStr(ANum: Cardinal; ALevel: TDigLevel): String;
    procedure ResetText;
  public
    {Public Declaration}
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure SetDefList;
    procedure LoadFromFile(const AFileName: TFileName); virtual;
    procedure SaveToFile(const AFileName: TFileName); virtual;
    function GetMonth(const D: TDateTime; Nominative: Boolean = True): String;
    function GetDate(const D: TDateTime): String;
    function GetDayOfWeek(const D: TDateTime): String;
    function GetInWord(const AValue: Double): String;

  published
    property FileName: TFileName read FFileName write SetFileName;

    property Comma: ShortString read FComma write SetComma; // ðàçäåëèòåëü öåëîé è äåñ. ÷àñòåé
    property CurrencyName: String read GetCurName; // íàèìåíîâàíèå âàëþòû
    property Male: Boolean read FMale write SetMale; // "ðîä" âàëþòû
    property Text: String read FText;  // çíà÷åíèå â âèäå òåêñòà
    property Separator: Char read FSeparator write SetSeparator; // ðàçäåëèòåëü ñëîâ â ôàéëå
    property Target: TLabel read FLabel write SetLabel; // ëåéáë íà ôîðìå
    property Value: Double read FValue write SetValue;  // çíà÷åíèå
  end;

implementation

{$ifdef ver150} // if Borland Delphi7 then...
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_CAST OFF}
{$endif}
const
  DefValues: array[0..13] of PChar = ( // unsafe type
    'One=îäèí;äâà;òðè;÷åòûðå;ïÿòü;øåñòü;ñåìü;âîñåìü;äåâÿòü;îäíà;äâå;íîëü',
    'Ten=äåñÿòü;îäèííàäöàòü;äâåíàäöàòü;òðèíàäöàòü;÷åòûðíàäöàòü;ïÿòíàäöàòü;' +
    'øåñòíàäöàòü;ñåìíàäöàòü;âîñåìíàäöàòü;äåâÿòíàäöàòü',
    'Twen=äâàäöàòü;òðèäöàòü;ñîðîê;ïÿòäåñÿò;øåñòäåñÿò;ñåìäåñÿò;âîñåìäåñÿò;äåâÿíîñòî',
    'Hndr=ñòî;äâåñòè;òðèñòà;÷åòûðåñòà;ïÿòñîò;øåñòñîò;ñåìñîò;âîñåìñîò;äåâÿòñîò',
    'Thou=òèñÿ÷à;òèñÿ÷è;òèñÿ÷',
    'Mill=ìèëëèîí;ìèëèèîíû;ìèëëèîíîâ',
    'Bill=ìèëëèàðä;ìèëëëèàðäû;ìèëëèàðäîâ',
    'Currency=ñóì;ñóì;ñóì',
    'CurrencyMale=0',
    'Cop=òèéèí;òèéèí;òèéèí',
    'Comma=,',
    'Month1=ßíâàðÿ;Ôåâðàëÿ;Ìàðòà;Àïðåëÿ;Ìàÿ;Èþíÿ;Èþëÿ;Àâãóñòà;Ñåíòÿáðÿ;Îêòÿáðÿ;Íîÿáðÿ;Äåêàáðÿ',
    'Month2=ßíâàðü;Ôåâðàëü;Ìàðò;Àïðåëü;Ìàé;Èþíü;Èþëü;Àâãóñò;Ñåíòÿáðü;Îêòÿáðü;Íîÿáðü;Äåêàáðü',
    'DayOfWeek=âîñêðåñåíüå;ïîíåäåëüíèê;âòîðíèê;ñðåäà;÷åòâåðã;ïÿòíèöÿ;ñóááîòà'
  );

// íåêîòîðûå ôóíêöèè
function Iif(Condition: Boolean; const Res1, Res2: String): String;
begin
  if Condition then Result := Res1 else Result := Res2;
end;

function TrimBlanks(const S: String): String;
const
  PointSign = [',', ';', '.', '!', '?'];
var
  i: Integer;
  T: String;
  B: Boolean;
begin
  T := Trim(S); Result := EmptyStr; // Òåïåðü ïîóáèðàåì ñèìâîëû âíóòðè ñòðîêè
  B := False;
  for i := 1 to Length(T) do begin // ïåðâûé ñèìâîë òî÷íî íå ïðîáåë
    if (T[i] > #32) then begin
      // äîáàâèì ïðîáåë, åñëè îí áûë, íî íå ïåðåä çíàêîì ïðèïèíàíèÿ
      if ((not (T[i] in PointSign)) and B) then Result := Result + #32;
      Result := Result + T[i];
    end;
    B := (T[i] <= #32);
  end;
end;

{ TInWord }

constructor TInWord.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  SetDefList;
  FText := EmptyStr;
  FValue := 0;
  FMale := False;
  FComma := ',';
  FLabel := nil;
  FFileName := EmptyStr;
  FSeparator := ';';
end;

destructor TInWord.Destroy;
begin
  FInWordList.Free;
  inherited;
end;

// Ïîèñê íóæíîãî çíà÷åíèÿ â êëþ÷å Name ïî ñ÷åòó Count
function TInWord.GetValue(Name: String; Count: Integer): String;
var
  S: String;
  i, p1, p2: Integer;
begin
  S := FInWordList.Values[Name];
  if Length(S) > 0 then begin
    i := 1;
    p1 := Pos(Separator, S);
    while (i < Count) and (p1 > 0) do begin
      S := Copy(S, p1 + 1, 255);
      p1 := Pos(Separator, S);
      Inc(i);
    end;
    if i = Count then begin // òî ÷òî íàäî!
      p2 := Pos(Separator, S);
      if p2 > 0 then S := Copy(S, 1, p2 - 1); // else S := Copy(S, 1, 255);
      S := Concat(Trim(S), ' ');
    end else S := EmptyStr;
  end;
  Result := S;
end;

procedure TInWord.ResetText;
var
  S: String;
  L: Int64; // Òîëüêî Int64 ðàáîòàåò ïðàâèëüíî äëÿ ìèëëèàðäîâ!
begin
  if FValue > 999.99999999999E+9 then begin
    FText := '******************';
    if Assigned(FLabel) then FLabel.Caption := FText;
    Exit;
  end;
  // Íà÷íåì ñíà÷àëà
  L := Trunc(FValue);
  if L = 0 then S := GetValue('One', 12)
  else begin
    S := NumToStr(Trunc(L / 1E+9), lvlBillion);
    L := L mod Trunc(1E+9);
    S := S + NumToStr(Trunc(L / 1E+6), lvlMillion);
    L := L mod Trunc(1E+6); //1E+6;
    S := S + NumToStr(Trunc(L / 1E+3), lvlThousand);
    L := L mod 1000; //1E+3;
  end;
  S := S + NumToStr(L, lvlNone); // âàëþòó äîïèñàëè
  { Åñëè âîîáùå ñóùåñòâóåò îáîçíà÷åíèå êîïååê, òî äîïèøåì êîïåéêè }
  if Length(Trim(GetValue('Cop', 1))) > 0  then begin
    L := Round((FValue - Trunc(FValue)) * 100);
    S := Trim(S) + FComma + ' ' + FormatFloat('00 ', L);
    if L > 20 then L := L mod 10;
    case L of
      1: S := S + GetValue('Cop', 1);
      2..4: S := S + GetValue('Cop', 2);
      else S := S + GetValue('Cop', 3);
    end;
  end;
  FText := Trim(Concat(AnsiUpperCase(Copy(S, 1, 1)), Copy(S, 2, 255)));
  if Assigned(FLabel) then FLabel.Caption := FText;
end;

procedure TInWord.SetValue(NewValue: Double);
begin
  if FValue <> Abs(NewValue) then begin
    FValue := Abs(NewValue);
    ResetText;
  end;
end;

function TInWord.NumToStr(ANum: Cardinal; ALevel: TDigLevel): String;
const
  DigLevelNames: array[TDigLevel] of PChar = ('', 'Thou', 'Mill', 'Bill');
var
  Male: Boolean;
begin
  case ALevel of
    lvlThousand: Male := False;
    lvlMillion, lvlBillion: Male := True;
    else Male := FMale;
  end;
  if (ANum = 0) and (ALevel <> lvlNone) then begin
    Result := EmptyStr;
    Exit;
  end;
  Result := GetValue('Hndr', ANum div 100);
  ANum := ANum mod 100;
  if ANum >= 20 then begin
    Result := Result + GetValue('Twen', ANum div 10 - 1);
    ANum := ANum mod 10;
  end;
  if ANum >= 10 then Result := Result + GetValue('Ten', ANum - 10 + 1)
  else begin
    if (ANum in [1, 2]) and not Male then Result := Result + GetValue('One', ANum + 10 - 1)
      else Result := Result + GetValue('One', ANum);
  end;
  if ALevel = lvlNone then // äîáàâëÿåì âàëþòó
    case ANum of
      1: Result := Result + GetValue('Currency', 1);
      2..4: Result := Result + GetValue('Currency', 2);
      else Result := Result + GetValue('Currency', 3);
    end
  else // èëè óðîâåíü
    case ANum of
      1: Result := Result + GetValue(DigLevelNames[ALevel], 1);
      2..4: Result := Result + GetValue(DigLevelNames[ALevel], 2);
      else Result := Result + GetValue(DigLevelNames[ALevel], 3);
    end;
end;

procedure TInWord.SetMale(AMale: Boolean);
const
  CMale: array[Boolean] of String[1] = ('1', '0');
begin
  if FMale <> AMale then begin
    FMale := AMale;
    FInWordList.Values['CurrencyMale'] := CMale[FMale];
    ResetText;
  end;
end;

procedure TInWord.SetComma(AComma: ShortString);
begin
  AComma := Trim(AComma);
  if AComma <> FComma then begin
    FComma := AComma;
    ResetText;
  end;
end;

procedure TInWord.SetLabel(ALabel: TLabel);
begin
  FLabel := ALabel;
  ResetText;
end;

procedure TInWord.LoadFromFile(const AFileName: TFileName);
const
  CMale = 'YES,Y,T,TRUE,ÄÀ,Ä,Ì,M,1';
begin
  try // Íóæíî ëè çäåñü äåëàòü Clear ???
    FInWordList.Clear;
    FInWordList.LoadFromFile(AFileName);
    if Length(GetValue('One', 9)) = 0 then raise Exception.Create('Ýòî íå ôàéë ïîääåðæêè ÿçûêà!');
    FMale := Pos(AnsiUpperCase(Trim(GetValue('CurrencyMale', 1))), CMale) > 0;
    SetComma(GetValue('Comma', 1));
    ResetText;
  except
    on E:Exception do begin
      SetDefList;
      raise Exception.CreateFmt('%s'#10'%s', [E.Message, Self.ClassName]);
    end;
  end;
end;

procedure TInWord.SaveToFile(const AFileName: TFileName);
begin
  try
    FInWordList.SaveToFile(AFileName);
  except
    raise Exception.CreateFmt('%s'#10'Îøèáêà çàïèñè ôàéëà %s', [Self.ClassName, AFileName]);
  end;
end;

procedure TInWord.SetFileName(const Value: TFileName);
begin
  if AnsiUpperCase(FFileName) <> AnsiUpperCase(Value) then begin
    FFileName := Value;
    if FileExists(FFileName) then LoadFromFile(FFileName)
    else raise Exception.CreateFmt('Ôàéë %s íå íàéäåí!', [FFileName]);
  end;
end;

function TInWord.GetMonth(const D: TDateTime; Nominative: Boolean): String;
begin
  Result := Trim(GetValue(Iif(Nominative, 'Month1', 'Month2'), StrToInt(FormatDateTime('mm', D))));
end;

function TInWord.GetDate(const D: TDateTime): String;
begin
  Result := TrimBlanks(Format('%s %s %s', [FormatDateTime('d', D),
    AnsiLowerCase(GetMonth(D, False)), FormatDateTime('yyyy', D)]));
end;

procedure TInWord.SetDefList;
var
  i: Integer;
begin
  if not Assigned(FInWordList) then FInWordList := TStringList.Create;
  FInWordList.Clear;
  with FInWordList do for i := Low(DefValues) to High(DefValues) do Add(String(DefValues[i]));
end;

procedure TInWord.SetSeparator(const Value: Char);
begin
  if FSeparator <> Value then begin
    FSeparator := Value;
    ResetText;
  end;
end;

function TInWord.GetDayOfWeek(const D: TDateTime): String;
begin
  Result := GetValue('DayOfWeek', Abs(Trunc(D) - 1) mod 7 + 1);
end;

{ Âûçîâ ìåòîäîâ
   TInWord.Value := MyNumber;
   Label1.Caption := TInWord.Text;
 çåìåíÿåòñÿ íà
   Label1.Caption := TInWord.GetInWord(MyNumber);
}
function TInWord.GetInWord(const AValue: Double): String;
begin
  if AValue <> Value then begin
    Value := AValue; // Âûçûâàåòñÿ âìåñòî SetValue
  end;
  Result := Text;
end;

function TInWord.GetCurName: String;
begin
  Result := GetValue('Currency', 1);
end;

end.

не знаю почему руские слова перевелис на абракадабра но всё рабочая.
автор Александр Ш.
я им пользуюсь.
но мне теперь требутса на другие языки. например на туредские. 
(там тоже много символов в алфавите).
ТО ЕСТЬ СУММАПРОПИСЬЮ НА ТЕ ЯЗЫКИ КОТОРЫЕ ИМЕЮТ БУКВЫ НЕ ОТОБРАЖЕННЫХ НА КЛАВИАТУРЕ?
не подскажете как переделать ?
Заране СПС за внимание!

Это сообщение отредактировал(а) mr_tg - 30.8.2012, 14:24
PM MAIL   Вверх
Данкинг
Дата 28.8.2012, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Цитата(mr_tg @  28.8.2012,  10:28 Найти цитируемый пост)
не знаю почему руские слова перевелис на абракадабра

Потому что копировать в буфер надо было при русской раскладке.
Цитата(mr_tg @  28.8.2012,  10:28 Найти цитируемый пост)
не подскажете как переделать ?

Дык, русские числительные прописью заменить на турецкие, а как ещё-то? Ну, там bir, iki, üç, dort. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
mr_tg
Дата 28.8.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 29.3.2008

Репутация: нет
Всего: нет



da imenn te slova. Kak ih nabrat 4tobi ih otrazit. Da netolko turkish. Idrugiye yaziki. Menya interesuyet dobveniye simvolOV UPGRADE etogo modulya.  smile 
PM MAIL   Вверх
Данкинг
Дата 28.8.2012, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



Цитата(mr_tg @  28.8.2012,  12:31 Найти цитируемый пост)
Kak ih nabrat 4tobi ih otrazit.

В смысле - как юникодные символы отобразить, что ли?
Кстати, в модуле там много лишнего же понапихано, не только сумма прописью.

Это сообщение отредактировал(а) Данкинг - 28.8.2012, 12:00


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
mr_tg
Дата 28.8.2012, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 29.3.2008

Репутация: нет
Всего: нет



СПС Данкинг!

1)    Копировать текст при русском раскладке помогло. Буду знать
2)    В модуле очень много лишнего знаю. Не стал менять оригинальное состояние не мешает smile может пригодится в дальнейшем
3)    когда мне нужно было вставлять символа которые можно найти WORD\вставить\символ\ с юникодом 00E7 я делал так. (нашол в интернете)
Word.Selection.InsertSymbol(00E7,Unicode:=True);
4)    Не ужели ни кому не приходилось  переводить суммпрописью на не стандартные языки.
5)    Как мне отразить в Делфи7 символ узнанный юникод из ворда. И поставит например на МЕМО, Label или EDIT. Не могли бы дать примерчик, А дальше я бы постарался понять как это работает  



Это сообщение отредактировал(а) mr_tg - 30.8.2012, 14:22
PM MAIL   Вверх
mr_tg
Дата 29.8.2012, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 29.3.2008

Репутация: нет
Всего: нет



Цитата

4)    Не ужели ни кому не приходилось  переводить суммпрописью на не стандартные языки.5)    Как мне отразить в Делфи символ узнанный юникод из ворда. И поставит например на МЕМО, Label или EDIT. Не могли бы дать примерчик, А дальше я бы постарался понять как это работает  
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.