Форум: "Прочее";
Текущий архив: 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