Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

Перевод числа в строку на разных языках   Найти похожие ветки 

 
O.O   (2008-01-24 05:08) [0]

Подскажите можно ли найти компоненту, или DLL которые могут переводить число в строку на разных языках, типа по русски, по немецки, по французски ?


 
KilkennyCat ©   (2008-01-24 05:32) [1]

а не типа?


 
O.O   (2008-01-24 05:35) [2]

223 - Двести двадцать три
а как это по немецки или по французски? Вот это имеется ввиду


 
KilkennyCat ©   (2008-01-24 05:42) [3]

тогда можно.


 
O.O   (2008-01-24 05:49) [4]

А где или как?


 
KilkennyCat ©   (2008-01-24 05:55) [5]

в интернете поисковиками или расклейкой объявлений.


 
O.O   (2008-01-24 06:01) [6]

И зачем себя мучать и выдавать другим такие "секреты" ?  :)


 
PEAKTOP ©   (2008-01-24 06:16) [7]


UNIT
 peaktop_rsp;
INTERFACE
TYPE
 TLanguage = (
    langRussian  
   ,langUkrainian
 );
 TValute   = (
    valRussiaFederation
   ,valUkraine
   ,valUnitedStatesOfAmerica
   ,valEUROPE
 );
 TGender    = ( // Пол валюты. Например "рубль" - geMale, "гривня" - geFemale
    geMale
   ,geFemale
 );
 TReturnValue = (
    retValue
   ,retNDS
   ,retValueAndNDS
 );
CONST
 RefGender :array[TValute]of array[0..1]of TGender = (
    (geMale  , geFemale )
   ,(geFemale, geFemale )
   ,(geMale  , geMale   )
   ,(geMale  , geFemale )
 );
 ValuteNames :array[TValute]of string = (
    "RUR"
   ,"UAH"
   ,"USD"
   ,"EUR"
 );
 LanguageNames:array[TLanguage]of string = (
    "RUS"
   ,"UKR"
 );

FUNCTION GetValuteByName(const Name :String):TValute;
FUNCTION GetLanguageByName(const Name:String):TLanguage;
FUNCTION MoneyToStringFmt(
  MoneyValue          :Currency;
  Valute              :TValute ;
  Language            :TLanguage;
  FractalPartToString :Boolean
  ):string;

IMPLEMENTATION
uses
 SysUtils;
// For restrict You must change implementation of this constants by changes
// that You had done at types
// WARNING !!!!  All of next constants must be ended with symbol "Space" = #32
CONST
 Zeros       :array[TLanguage]of string = (
    "ноль "
   ,"нуль "
 );
 Smaller10   :array[TGender] of array[TLanguage]of array[1..9]of string = (
   (
     ("один " ,"два " ,"три " ,"четыре " ,"пять "   ,"шесть " ,"семь " ,"восемь ","девять "  ),
     ("один " ,"два " ,"три " ,"чотири " ,"п""ять " ,"шiсть " ,"сiм "  ,"вiсiм " ,"дев""ять ")
   ),
   (
     ("одна " ,"две " ,"три " ,"четыре " ,"пять "   ,"шесть " ,"семь " ,"восемь ","девять "  ),
     ("одна " ,"двi " ,"три " ,"чoтири " ,"п""ять " ,"шiсть " ,"сiм "  ,"вiсiм " ,"дев""ять ")
   )
 );
 Smaller20   :array[TLanguage]of array[11..19]of string = (
   ("одиннадцать ","двенадцать ","тринадцать ","четырнадцать ","пятнадцать "  , "шестнадцать ","семнадцать ","восемнадцать ","девятнадцать "  ),
   ("одинадцять " ,"дванадцять ","тринадцять ","чотирнадцять ","п""ятнадцять ", "шiстнадцять ","сiмнадцять ","вiсiмнадцять ","дев""ятнадцять ")
 );
 Smaller100  :array[TLanguage]of array[1..9]of string = (
   ("десять ","двадцать ","тридцать ","сорок ","пятьдесят " ,"шестьдесят ", "семьдесят ","восемьдесят ","девяносто "  ),
   ("десять ","двадцять ","тридцять ","сорок ","п""ятдесят ","шiстдесят " , "сiмдесят " ,"вiсiмдесят " ,"дев""яносто ")
 );
 Smaller1000 :array[TLanguage]of array[1..9]of string = (
   ("сто ","двести ","триста ", "четыреста ","пятьсот " ,"шестьсот ","семьсот ", "восемьсот ","девятьсот  "),
   ("сто ","двiстi ","триста ", "чотириста ","п""ятсот ","шiссот   ","сiмсот " , "вiсiмсот " ,"дев""ятсот ")
 );
 Thousand    :array[TLanguage]of array [1..3] of string = (
   ("тысяча ","тысячи ","тысяч "),
   ("тисяча ","тисячi ","тисяч ")
 );
 Million     :array[TLanguage]of array [1..3]of string = (
   ("миллион ","миллиона ","миллионов "),
   ("мiльон " ,"мiльона " ,"мiльонiв " )
 );
 Milliard    :array[TLanguage]of array [1..3]of string = (
   ("миллиapд " ,"миллиаpдa " ,"миллиapдoв " ),
   ("мiл""яpд " ,"мiл""яpдa " ,"мiл""яpдiв " )
 );
 Trillion    :array[TLanguage]of array [1..3]of string = (
   ("триллион ","триллионa ","триллионoв "),
   ("трилiон " ,"трилiонa  ","трилiонiв  ")
 );
 FractalPart :array[TLanguage]of array[TValute]of array[1..3]of string =(
   (
    //=============================================
    // In Slavian laguages like Ukrainian or Russian
    //---------------------------------------------
    // ImPadeg    | RodPadeg      | RodPadeg MnChslo
    //=============================================
     ("копейка "   ,"копейки "    ,"копеек "      ),
     ("копейка "   ,"копейки "    ,"копеек "      ),
     ("цент США "  ,"цента США "  ,"центов США "  ),
     ("цент евро " ,"цента евро " ,"центов евро " )
   ),
   (
     ("копiйка "   ,"копiйки "    ,"копiйок "     ),
     ("копiйка "   ,"копiйки "    ,"копiйок "     ),
     ("цент США "  ,"центи США "  ,"центiв США "  ),
     ("цент євро " ,"цент євро "  ,"цент євро "   )
   )
 );
 IntegerPart :array[TLanguage]of array[TValute]of array[1..3]of string =(
   (
     ("рубль "     ,"рубля "      ,"рублей "      ),
     ("гривна "    ,"гривны "     ,"гривен "      ),
     ("доллар США ","доллара США ","долларов США "),
     ("евро "      ,"евро "       ,"евро "        )
   ),
   (
     ("рубль "     ,"рубля "      ,"рублiв "      ),
     ("гривня "    ,"гривнi "     ,"гривень "     ),
     ("доллар США ","доллара США ","долларiв США "),
     ("євро "      ,"євро "       ,"євро "        )
   )
 );



 
PEAKTOP ©   (2008-01-24 06:17) [8]


{==============================================================================}
FUNCTION GetValuteByName(const Name :String):TValute;
var
 V:TValute;
begin                                          // if Name = WrongParam then
Result := valUkraine;                          // Default Result = Ukrainian Grivna
for V:=Low(TValute) to High(TValute) do
 if(UpperCase(Name) = ValuteNames[V])then
   begin
   Result := V;
   Exit;
   end;
end;
{==============================================================================}
FUNCTION GetLanguageByName(const Name:String):TLanguage;
var
 L:TLanguage;
begin                                          // if Name = WrongParam then
Result := langUkrainian;                       // Default Result = Ukrainian Language
for L:=Low(TLanguage) to High(TLanguage) do
 if(UpperCase(Name) = LanguageNames[L])then
   begin
   Result := L;
   Exit;
   end;
end;
{==============================================================================}
function ExtractString1(
          I        :Integer;
          N        :Integer;
          Language :TLanguage;
          Gender   :TGender;
          Valute   :TValute
          ):string;
var
 a,sfx:integer;
begin
Result:="";
sfx:=3;
a:= I div 100;
if (a>0) then
 begin
 Result:=Result+Smaller1000[Language][a];
 I:=I-a*100;
 end;
if (I>19) then
 begin
 a:= I div 10;
 if(a>0)then
   begin
   Result:=Result+Smaller100[Language][a];
   I:=I-a*10;
   if I>0 then
     begin
     Result := Result + Smaller10[Gender][Language][I];
     case I of
       1    : sfx:=1;
       2..4 : sfx:=2;
       5..9 : sfx:=3;
       end;
     end;
   end;
 end
else
 case I of
   1      :begin
           Result := Result + Smaller10[Gender][Language][I];
           sfx:=1;
           end;
   2..4   :begin
           Result := Result + Smaller10[Gender][Language][I];
           sfx:=2;
           end;
   5..9   :begin
           Result := Result + Smaller10[Gender][Language][I];
           sfx:=3;
           end;
   10     :begin
           Result := Result + Smaller100[Language][1];
           sfx:=3;
           end;
   11..19 :begin
           Result := Result + Smaller20[Language][I];
           sfx:=3;
           end;
   end;
case n of
 0: Result := Result + FractalPart[Language][Valute][sfx];
 1: Result := Result + IntegerPart[Language][Valute][sfx];
 2: Result := Result + Thousand[Language][sfx];
 3: Result := Result + Million [Language][sfx];
 4: Result := Result + Milliard[Language][sfx];
 5: Result := Result + Trillion[Language][sfx];
 end;
end;
{==============================================================================}
function ExtractString2(
          I               :Integer;
          FractalToString :boolean;
          Language        :TLanguage;
          Gender          :TGender;
          Valute          :TValute
          ):string;
var
 sfx,H:integer;
begin
Result:="";
if FractalToString then
 begin
 if i=0 then Result := Zeros[Language] + FractalPart[Language][Valute][3]
        else Result := ExtractString1(I, 0, Language, Gender, Valute);
 end
else
 begin
 sfx:=3;
 H:=(I mod 10);
 case H of
   1   : sfx:=1;
   2..4: sfx:=2;
   end;
 if(I in [11..19]) then sfx:=3;
 if I<10 then Result:="0"+IntToStr(I)+" "+FractalPart[Language][Valute][sfx]
         else Result:=    IntToStr(I)+" "+FractalPart[Language][Valute][sfx];
 end;
end;
{==============================================================================}
function MoneyToStringFmt(
  MoneyValue          :Currency;
  Valute              :TValute ;
  Language            :TLanguage;
  FractalPartToString :Boolean):string;
var
 I :LongInt;
 H :LongInt;
 V :String;
 F :String;
 L :String;
 s1:Currency;
 dH:Currency;
begin
 V:="";
 s1:=MoneyValue;
 dH:=1e12;
 I:=Trunc(MoneyValue/dH);
 if(I>0)then
   begin
   V:=ExtractString1(I, 5, Language, RefGender[Valute][0], Valute);
   MoneyValue:=MoneyValue-Trunc(MoneyValue/dH)*dH;
   end;
 dH:=1000000000;
 I :=Trunc(MoneyValue/dH);
 if (I>0)then
   begin
   V:=V+ExtractString1(I, 4, Language, RefGender[Valute][0], Valute);
   MoneyValue:=MoneyValue-Trunc(MoneyValue/dH)*dH;
   end;
 H:=1000000;
 I:=Trunc(MoneyValue/H);
 if(I>0)then
   begin
   V := V + ExtractString1(I, 3, Language, RefGender[Valute][0], Valute);
   MoneyValue:=MoneyValue-Trunc(MoneyValue/H)*H;
   end;
 H:=1000;
 I:=Trunc(MoneyValue/H);
 if (I>0)then
   begin
   V := V + ExtractString1(I, 2, Language, RefGender[Valute][0], Valute);
   MoneyValue:=MoneyValue-Trunc(MoneyValue/H)*H;
   end;
 H:=1;
 I:=Trunc(MoneyValue/H);
 if(I>0)then
   begin
   V := V + ExtractString1(I, 1, Language, RefGender[Valute][0], Valute);
   MoneyValue:=MoneyValue-Trunc(MoneyValue/H)*H;
   end
  else
   V := V+IntegerPart[Language][Valute][3];
 I:=Trunc(MoneyValue*100);
 V := V + ExtractString2(I, FractalPartToString, Language, RefGender[Valute][1], Valute);
 if s1 < 1 then  V := Zeros[Language] + V;
 f:=AnsiUpperCase(Copy(V,1,1));
 l:=Copy(V,2,256);
 V:=f+l;
 Result:=V;
end;
{==============================================================================}
END.


 
PEAKTOP ©   (2008-01-24 06:27) [9]

Пример использования:
................
var S :string;
.........
begin
 ........
 S := MoneyToStringFmt(23678.56, valUkraine, langRussian, false);
end;


Ограничения:
1) Функция корректно работает только с 2-х звенными валютами, имеющими сотые части. Например, 1$ = 100 центов, 1рубль = 100 копеек. Функция не будет корректно работать с трехзвенными валютами, и валютами не имеющими сотой части. Например, до 1972 года в Соединенном королевстве 1фунт (соверн) = 12 шиллингов, 1 шиллинг = 12 пенсов (пенни).
2) Функция может быть расширина на другия языки в декларативной части модуля путем добавления соответствующих констант. Алгоритмически она правильно будет работать только на славянских языках и на болгарском (языках, имеющих родительный падеж и родительный падеж во множественном числе), а также на языках одновременно не имеющих ни падежей, ни числа Например, ДжунГоХуа (стандартный китайский), ПунТуХуа, тайский.


 
O.O   (2008-01-24 08:05) [10]

Спасибо, но к сожалению по русски и украински у меня есть, сам написал когдато, а вот сейчас понадобилось чтоб на других языках ещё заговорила, в которых я не силён, и конечно чтоб правильно это делала. Вот и спросил может кто поможет найти многоязыковый модуль если таковые имеются.


 
Bless ©   (2008-01-24 09:02) [11]


> PEAKTOP ©   (24.01.08 06:16) [7]
> ...мiльон...


имхо, все же мiльйон.
Это я так, в качестве лирического отступления.


 
MsGuns ©   (2008-01-24 09:15) [12]

>[7]-[8]

Ужос ! Приснится такое - не проснешься ;)



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
15-1201230431
Slider007
2008-01-25 06:07
2008.02.24
С днем рождения ! 25 января 2008 пятница


11-1184218228
BMouradov
2007-07-12 09:30
2008.02.24
KOLTreeView - корневые узлы


2-1201538438
ComboBox
2008-01-28 19:40
2008.02.24
Шрифт в ComboBox


4-1183823617
AlexanderMS
2007-07-07 19:53
2008.02.24
Изменение положения ползунка в TrackBar.


6-1180002451
FireMan_Alexey
2007-05-24 14:27
2008.02.24
snova Proxy!