
Опытный
 
Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва
Репутация: 1 Всего: 1
|
Цитата(Dmi3ev @ 10.6.2008, 01:01 ) | | чуть-чуть доделать и будет неплохая прога |
я тут чуть-чуть доделал: | Код | //$$---- Form CPP ---- //---------------------------------------------------------------------------
#include <vcl.h> #pragma hdrstop
#include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm"
// don't remove this header // date: 12.06.08 // author: fish9370
TForm1 *Form1;
const int MORPH_TYPE_NONE = 0; const int MORPH_TYPE_NUM = 1; const int MORPH_TYPE_THOUSAND = 2; const int MORPH_TYPE_MILLION = 3; const int MORPH_TYPE_BILLION = 4;
const int MORPH_SEX_FML = 0; const int MORPH_SEX_ML = 1;
const int MORPH_TYPE_RUB = 6; const int MORPH_TYPE_RKOP = 7; const int MORPH_TYPE_USD = 8; const int MORPH_TYPE_UCNT = 9; const int MORPH_TYPE_EUR = 10; const int MORPH_TYPE_ECNT = 11;
const int DGT_POS_00X = 0; const int DGT_POS_0X0 = 1; const int DGT_POS_X00 = 2;
const int SPL_HI = 0; const int SPL_LO = 1;
class _DigToStr { TStringList *sz1; // 000 000 000 00X единицы TStringList *sz2; // 000 000 000 0X0 десятки TStringList *sz3; // 000 000 000 X00 сотни TStringList *sz4; // 000 000 00X 000 тысячи
TStringList *sz7; // единицы измерения, старшие TStringList *sz8; // единицы измерения, младшие AnsiString triad(int nD, int nPos, int nSex) { switch(nPos) { case DGT_POS_00X: if(nD<20) return morph(sz1->Strings[nD], MORPH_TYPE_NUM, nSex, nD); break; case DGT_POS_0X0: return sz2->Strings[nD]; case DGT_POS_X00: return sz3->Strings[nD]; }
return (AnsiString)""; } public: _DigToStr() { sz1 = new TStringList; sz1->Add(""); // 0 sz1->Add("од"); // 1 sz1->Add("дв"); // 2 sz1->Add("три"); // 3 sz1->Add("четыре"); // 4 sz1->Add("пять"); // 5 sz1->Add("шесть"); // 6 sz1->Add("семь"); // 7 sz1->Add("восемь"); // 8 sz1->Add("девять"); // 9 sz1->Add("десять"); // 10 sz1->Add("одинадцать"); // 11 sz1->Add("двенадцать"); // 12 sz1->Add("тринадцать"); // 13 sz1->Add("четырнадцать"); // 14 sz1->Add("пятнадцать"); // 15 sz1->Add("шестнадцать"); // 16 sz1->Add("семнадцать"); // 17 sz1->Add("восемнадцать"); // 18 sz1->Add("девятнадцать"); // 19
sz2 = new TStringList; sz2->Add(""); sz2->Add("десять"); sz2->Add("двадцать"); sz2->Add("тридцать"); sz2->Add("сорок"); sz2->Add("пятьдесят"); sz2->Add("шестьдесят"); sz2->Add("семьдесят"); sz2->Add("восемьдесят"); sz2->Add("девяносто");
sz3 = new TStringList; sz3->Add(""); sz3->Add("сто"); sz3->Add("двести"); sz3->Add("триста"); sz3->Add("четыреста"); sz3->Add("пятьсот"); sz3->Add("шестьсот"); sz3->Add("семьсот"); sz3->Add("восемьсот"); sz3->Add("девятьсот");
sz4 = new TStringList; sz4->Add("тысяч"); sz4->Add("миллион"); sz4->Add("миллиард");
sz7 = new TStringList; sz7->Add("рубл"); sz7->Add("доллар"); sz7->Add("евро");
sz8 = new TStringList; sz8->Add("коп"); sz8->Add("цент"); sz8->Add("цент"); } ~_DigToStr() { sz1->Free(); sz2->Free(); sz3->Free(); sz4->Free();
sz7->Free(); sz8->Free(); } AnsiString morph(AnsiString szWord, int nType, int nSex, int nVal) { AnsiString szA = szWord; switch(nType) { case MORPH_TYPE_NUM: switch(nVal) { case 1: if(nSex == MORPH_SEX_ML) return szA + "ин"; else return szA + "на"; case 2: if(nSex == MORPH_SEX_ML) return szA + "а"; else return szA + "е"; } break; case MORPH_TYPE_THOUSAND: { switch(nVal) { case 1: return szA + "а"; case 2: case 3: case 4: return szA + "и"; } } break; case MORPH_TYPE_MILLION: case MORPH_TYPE_BILLION: { switch(nVal) { case 1: return szA; case 2: case 3: case 4: return szA + "а"; default: return szA + "ов"; } } //break;
case MORPH_TYPE_RUB: switch(nVal) { case 1: return szA + "ь"; case 2: case 3: case 4: return szA + "я"; default: return szA + "ей"; } //break; case MORPH_TYPE_RKOP: switch(nVal) { case 1: return szA + "ейка"; case 2: case 3: case 4: return szA + "ейки"; default: return szA + "еек"; } //break; case MORPH_TYPE_USD: case MORPH_TYPE_ECNT: case MORPH_TYPE_UCNT: switch(nVal) { case 1: return szA; case 2: case 3: case 4: return szA + "а"; default: return szA + "ов"; } //break; case MORPH_TYPE_EUR: switch(nVal) { default: return szA; } //break; default: return (AnsiString)""; } return szA; }
AnsiString parsing(long nD, int nCurrency, int _nSex) { if(nD == 0) return (AnsiString)""; AnsiString szS, szA;
szA = IntToStr(nD); int nVal; if(szA.Length() < 2) szA = szA.StringOfChar('0',2 - szA.Length()) + szA; if(szA[szA.Length() - 1] - 48 != 1) nVal = szA[szA.Length()] - 48; else nVal = szA.SubString(szA.Length() - 2,2).ToInt();
switch(nCurrency) { case MORPH_TYPE_RUB: szS = " " + morph(sz7->Strings[0], MORPH_TYPE_RUB,0, nVal); break; case MORPH_TYPE_RKOP: szS = " " + morph(sz8->Strings[0], MORPH_TYPE_RKOP,0, nVal); break; case MORPH_TYPE_USD: szS = " " + morph(sz7->Strings[1], MORPH_TYPE_USD,0, nVal); break; case MORPH_TYPE_UCNT: szS = " " + morph(sz8->Strings[1], MORPH_TYPE_UCNT,0, nVal); break; case MORPH_TYPE_EUR: szS = " " + morph(sz7->Strings[2], MORPH_TYPE_EUR,0, nVal); break; case MORPH_TYPE_ECNT: szS = " " + morph(sz8->Strings[2], MORPH_TYPE_ECNT,0, nVal); break; }
for(int i=1; nD; i++) { szA = IntToStr(nD % 1000); szA = szA.StringOfChar('0',3 - szA.Length()) + szA;
int nSex, nVal; if(szA[2] - 48 != 1) nVal = szA[3] - 48; else nVal = szA.SubString(2,2).ToInt();
if(szA != "000") switch(i) { case MORPH_TYPE_NUM: nSex = _nSex; break; case MORPH_TYPE_THOUSAND: szS = " " + morph(sz4->Strings[0], MORPH_TYPE_THOUSAND, 0,nVal) + szS; nSex = MORPH_SEX_FML; break; case MORPH_TYPE_MILLION: szS = " " + morph(sz4->Strings[1], MORPH_TYPE_MILLION, 0,nVal) + szS; nSex = MORPH_SEX_ML; break; case MORPH_TYPE_BILLION: szS = " " + morph(sz4->Strings[2], MORPH_TYPE_BILLION, 0,nVal) + szS; nSex = MORPH_SEX_ML; }
if(szA[2] - 48 != 1) { szS = triad(szA[3] - 48, DGT_POS_00X, nSex) + szS; szS = " " + szS; szS = triad(szA[2] - 48, DGT_POS_0X0, nSex) + szS; szS = " " + szS; szS = triad(szA[1] - 48, DGT_POS_X00, nSex) + szS; szS = " " + szS; } else { szS = triad(szA.SubString(2,2).ToInt(), DGT_POS_00X, MORPH_SEX_ML) + szS; szS = " " + szS; szS = triad(szA[1] - 48, DGT_POS_X00, MORPH_SEX_ML) + szS; szS = " " + szS; }
nD /= 1000; }
return szS; }
AnsiString split(AnsiString szWord, int nType) { if(szWord.Trim() == "") return (AnsiString)""; switch(nType) { case SPL_HI: if(szWord.Pos(",")) return szWord.SubString(0, szWord.Pos(",") - 1); else return szWord; case SPL_LO: if(szWord.Pos(",")) return szWord.SubString(szWord.Pos(",") + 1,szWord.Length() - szWord.Pos(",")); } return "0"; } AnsiString toStr(AnsiString szWord, int nType) { switch(nType) { case MORPH_TYPE_RUB: return (parsing(split(szWord,SPL_HI).ToInt(),MORPH_TYPE_RUB, MORPH_SEX_ML) + " " + parsing(split(szWord,SPL_LO).ToInt(),MORPH_TYPE_RKOP, MORPH_SEX_FML)).Trim(); case MORPH_TYPE_USD: return (parsing(split(szWord,SPL_HI).ToInt(),MORPH_TYPE_USD, MORPH_SEX_ML) + " " + parsing(split(szWord,SPL_LO).ToInt(),MORPH_TYPE_UCNT, MORPH_SEX_ML)).Trim(); case MORPH_TYPE_EUR: return (parsing(split(szWord,SPL_HI).ToInt(),MORPH_TYPE_EUR, MORPH_SEX_ML) + " " + parsing(split(szWord,SPL_LO).ToInt(),MORPH_TYPE_ECNT, MORPH_SEX_ML)).Trim(); } return "ноль"; } };
//--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { _DigToStr D; Edit1->Text = D.toStr(Edit1->Text, MORPH_TYPE_RUB); //Edit1->Text = D.toStr(Edit1->Text, MORPH_TYPE_USD); //Edit1->Text = D.toStr(Edit1->Text, MORPH_TYPE_EUR); } //---------------------------------------------------------------------------
//todo: // добавить валидатор для проверки правильности ввода //
|
Это сообщение отредактировал(а) fish9370 - 12.6.2008, 00:46
--------------------
undefined
|