Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.042 c
15-1200506129
TStas
2008-01-16 20:55
2008.02.24
Чем открывать файл электронной книги djvu?


2-1201712168
AlexanderMS
2008-01-30 19:56
2008.02.24
Как "разбить" 1 байт на 4 группы по 2 бита.


2-1201488326
vegarulez
2008-01-28 05:45
2008.02.24
Вопрос про клозет датасет


3-1192011059
Alex
2007-10-10 14:10
2008.02.24
проблема в передаче выборки из БД в Rave


15-1201014410
oldman
2008-01-22 18:06
2008.02.24
DirectX версии 9.0c и выше.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский