Текущий архив: 2002.09.09;
Скачать: CL | DM;
ВнизInteger прописью Найти похожие ветки
← →
xyz (2002-08-22 02:10) [0]Здраствуйте!
Подскажите пожалуйста, сильно ли замедлит работу алгоритма функция inttostr()?
Или предложите как продолжить алгоритм до миллионов.
=======================================================
unit inttowrd;
interface
var
ed : array[0..19] of string=("","один","два","три","четыре",
"пять","шесть","семь","восемь","девять","десять","одиннадцать","двенадцать",
"тринадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать",
"восемнадцать","девятнадцать");
dec : array[2..9] of string=("двадцать","тридцать","сорок","пятьдесят",
"шестьдесят","семьдесят","восемьдесят","девяносто");
sot : array[1..9] of string=("сто","двести","триста","четыреста","пятьсот",
"шестьсот","семьсот","восемьсот","девятьсот");
function inttowd(n : integer) : string;
implementation
function ed32(n : integer) : string;
begin
result := ed[n];
end;
function dec32(n : integer) : string;
begin
case n of
0..19 : result := ed32(n);
20..29 : result := dec[2]+" "+ed[n-20];
30..39 : result := dec[3]+" "+ed[n-30];
40..49 : result := dec[4]+" "+ed[n-40];
50..59 : result := dec[5]+" "+ed[n-50];
60..69 : result := dec[6]+" "+ed[n-60];
70..79 : result := dec[7]+" "+ed[n-70];
80..89 : result := dec[8]+" "+ed[n-80];
90..99 : result := dec[9]+" "+ed[n-90];
end;
end;
function inttowd(n : integer) : string;
begin
case n of
0..99 : result :=dec32(n);
100..199 : result := sot[1]+" "+dec32(n-100);
200..299 : result := sot[2]+" "+dec32(n-200);
300..399 : result := sot[3]+" "+dec32(n-300);
400..499 : result := sot[4]+" "+dec32(n-400);
500..599 : result := sot[5]+" "+dec32(n-500);
600..699 : result := sot[6]+" "+dec32(n-600);
700..799 : result := sot[7]+" "+dec32(n-700);
800..899 : result := sot[8]+" "+dec32(n-800);
900..999 : result := sot[9]+" "+dec32(n-900);
end;
end;
end.
← →
Sam Stone (2002-08-22 09:01) [1]тебе какая скорость нужна? Если время увеличивается не больше, чем на 0.5 сек, то, по-моему, не стоит страдать.
← →
zavdim (2002-08-22 09:39) [2]Если надо то можно и до 10^!!! сделать. Я для говорения делал до 10^36-1. Если надо - пришлю. А в какой задаче применяя такое может возникнуть проблема скорости?
Ну а можно так например:
if n>100 then
result := sot[n div 100] + "" + dec32(n mod 100);
Вот, в таком духе значит.
← →
ShuraGrp (2002-08-22 10:09) [3]Я мог не совсем правильно понять вопрос, но где-то пару недель назад я нашел такой код. Может он тебе поможет.
{Этот алгоритм преобразует 12345 в "двенадцать тысяч триста сорок пять".
Для этого создана процедура, которая преобразует трехзначные числа в слова
и прибавляет к ним "тысяч" или "миллионов". Алгоритм корректен в смысле падежей и родов.
Поэтому 121000 он не переведет в "сто двадцать один тысяч".
Edit2.Text := IntToWords(Edit1.Text);
}
function IntToWords(s: string): string;
var
i, count: integer;
function ShortNum(num: word; razr: integer): string;
const
hundreds: array [0..9] of string = ("", " сто", " двести", " триста",
" четыреста", " пятьсот", " шестьсот", " семьсот", " восемьсот",
" девятьсот");
tens: array [0..9] of string = ("", "", " двадцать", " тридцать",
" сорок", " пятьдесят", " шестьдесят", " семьдесят", " восемьдесят",
" девяносто");
ones: array [3..19] of string = (" три", " четыре", " пять", " шесть",
" семь", " восемь", " девять", " десять", " одиннадцать",
" двенадцать", " тринадцать", " четырнадцать", " пятнадцать",
" шестнадцать", " семнадцать", " восемнадцать", " девятнадцать");
razryad: array [0..6] of string = ("", " тысяч", " миллион", " миллиард",
" триллион", " квадриллион", " квинтиллион");
var
t: byte; // десятки
o: byte; // единицы
begin
result := hundreds[num div 100];
if num mod 100 = 0 then Exit;
t := (num mod 100) div 10;
o := num mod 10;
if t <> 1 then begin
result := result + tens[t];
case o of
1: if razr = 1
then result := result + " одна"
else result := result + " один";
2: if razr = 1
then result := result + " две"
else result := result + " два";
3..9: result := result + ones[o];
end;
result := result + razryad[razr];
case o of
1: if razr = 1 then result := result + "а";
2..4: if razr = 1
then result := result + "и"
else if razr > 1 then result := result + "а";
else if razr > 1 then result := result + "ов";
end;
end else begin
result := result + ones[num mod 100];
result := result + razryad[razr];
if razr > 1 then result := result + "ов";
end;
end; //ShortNum
begin
if (Length(s) <= 0) or (s = "0") then begin
result := "ноль";
Exit;
end;
count := (Length(s) + 2) div 3;
if count > 7 then begin
result := "Value is too large";
Exit;
end;
result := "";
s := "00" + s;
for i := 1 to count do
result := ShortNum(StrToInt(copy(s, Length(s) - 3 * i + 1, 3)), i - 1) + result;
if Length(result) > 0 then delete(result, 1, 1);
end;
← →
Shoo (2002-08-22 16:21) [4]Всем функция хороша, но тупит! Проверьте число 78900012358. Теряет слово "миллионов".
← →
Shoo (2002-08-22 16:21) [5]2ShuraGrp:
Всем функция хороша, но тупит! Проверьте число 78900012358. Теряет слово "миллионов".
← →
Shoo (2002-08-22 16:25) [6]Еще проще, проверьте 100001. Возвращает "сто один".
← →
xyz (2002-08-22 22:05) [7]мне скорость необходима потому, что таких функций в программе может быть более 100 и каждая милисекунда на счету)))
Кстати, как измерить скорость выполнение функции? (без секундомера :-)))
ShuraGrp Спасибо, займусь отладкой новой функции... Но моя на сотнях проще)))
Спасибо!
← →
Dmk (2002-08-23 00:46) [8]Могу готовую выслать по почте. Проверял на скорость. Около пятисот тысяч вызовов за секунду на pIII550 384RAM под Win2K.
Range до 999 999 999 999.99
← →
Yaro (2002-08-23 07:06) [9]Dmk -> Мне вышли, пожалуйста!!! (Yaro2000@yandex.ru)
← →
Yaro (2002-08-23 07:09) [10]xyz -> Скорость? По-моему, не знать о такой замечательной функции, как GetTickCount - просто стыдно... (возвращает текущее время в миллисекундах со времени страрта ОС)
← →
plkoij (2002-08-23 11:43) [11]И мне вышли, askall@yandex.ru. Плиз
← →
Balu (2002-08-23 12:39) [12]И мне :-) balusoft@mail.ru
← →
xyz (2002-08-23 20:55) [13]Yaro
Мне очень стыдно, но нельзя ли с примерчиком?
Что где и как... Очен прошу...
← →
Yaro (2002-08-23 23:10) [14]Ну, что-то вроде этого:
var TimeShot, Repeats, i: Integer;
...
TimeShot := GetTickCount;
Repeats := 1000; // повторять тысячу раз
for i := 1 to Repeats do
begin
<участок твоего кода>
end;
TimeShot := (GetTickCount - TimeShot)/Repeats
ShowMessage("Время выполнения: " + FloatToStr(TimeShot) + " миллисекунд");
Пичем, чем больше Repeats, тем больше точность подсщета.
← →
Yaro (2002-08-23 23:11) [15]тоесть подСЧета, очепятка :)
← →
ShuraGrp (2002-08-26 11:58) [16]Народ каюсь полноценно не тестировал, т.к. сам не писал,
но если убрать строку if num mod 100 = 0 then Exit; в функции ShortNum (вторая), то вроде все нормально.
← →
Up (2002-08-26 12:29) [17]>ShuraGrp
Убрал строку if num mod 100 = 0 then Exit;
На 1000000000000000000 выдаёт: один квинтиллион квадриллионов триллионов миллиардов миллионов тысяч :)
>Dmk
Плиззз! Не поленись. Вышли и мне эту чудо-функцию :)
acabr @mail.ru
← →
xyz (2002-08-28 01:47) [18]А давайте все скинемся по функции и решим которая лучшая? А потом будем дружно использовать?
← →
deleon (2002-08-28 08:53) [19]Время работы алгоритмов в Delphi удобно мерять компонентой TVVMClock
http://www.dbwork.kuban.ru
← →
Konrads (2002-08-28 09:05) [20]Лет десять назад написал, до сих пор иногда использую, работает без ошибок, рубли уберёте и вперед :)
function TForm1.IntToTxt(Int: String): String;
const EDIN : array [0..12] of String[6] =
("","один","два","три","четыре","пять","шесть","семь","восемь","девять",
"десять","одна","две");
OKON : array [1..2, 1..3] of String[2] = (("а","и",""),("","а","ов"));
DES : array [0..19] of String[20] = ("","десять","двадцать","тридцать",
"сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят", "девяносто",
"","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать",
"шестнадцать","семнадцать","восемнадцать","девятнадцать");
SOT : array [0..9] of String[10] = ("","сто","двести","триста","четыреста",
"пятьсот","шестьсот","семьсот","восемьсот","девятьсот");
var l,l1,l2,l3 : integer;
f : boolean;
s,s1 : string;
begin
{*
* Функция превода целых чисел 0 < Num <= 999 999 999 999 999
* в прописной формат.
* Дробная часть отбрасывается.
*}
if int[1] = "0" then begin
result := "Ноль рублей";
exit;
end;
f := true;
s := "";
l := length(Int);
{if Flg then s1 := "руб.0 коп." else s1 := "";}
if Int[length(Int)-1] = "1" then s1 := "рублей" else
case Int[length(Int)] of
"1" : s1 := "рубль";
"2".."4" : s1 := "рубля";
else s1 := "рублей";
end;
while l > 0 do begin
l := length(int);
l3 := l mod 3;
if l3 = 0 then l3 := 3;
case l3 of
1: if Int[1] <> "0" then f := true else f := false;
2: if copy(Int,1,2) <> "00" then f := true else f := false;
3: if copy(Int,1,3) <> "000" then f := true else f := false;
end;
while l3 > 0 do begin
l := length(Int);
l1 := l mod 3;
l2 := StrToInt(Int[1]);
if (l > 3) and (l < 7) and ((l2 = 1) or (l2 = 2)) and (l1 = 1) then l2 := l2 + 10;
if (l1 = 2) and (l2 = 1) and (Int[2] <> "0") then begin
l2 := 10 + StrToInt(Int[2]);
Int := copy(Int,2,length(Int) - 1);
dec(l3);
end;
case l1 of
0: s := s + SOT[l2];
1: s := s + EDIN[l2];
2: s := s + DES[l2];
end;
if (l2 > 9) and (l1 = 2) then l2 := 5;
if l2 > 9 then l2 := l2 - 10;
case l2 of
1 : l2 := 1;
2..4: l2 := 2;
else l2 := 3;
end;
Dec(l3);
Int := Copy(Int, 2, length(Int) - 1);
s := s + " ";
end;
s := s + " ";
if f then
case l of
4..6: s := s + "тысяч" + OKON[1, l2];
7..9: s := s + "миллион" + OKON[2, l2];
10..12: s := s + "миллиард" + OKON[2, l2];
13..15: s := s + "триллион" + OKON[2, l2];
end;
s := s + " ";
l := length(int);
end;
result := s + s1;
l1 := Length(result); l := 1;
while l <> l1 do
if (result[l] = " ") and (result[l + 1] = " ") then begin
Delete(result, l, 1);
l1 := Length(result);
end else begin
Inc(l);
end;
if result[l] = " " then Delete(result, l, 1);
if Length(result) > 0 then result[1] := chr(ord(result[1])-32);
end;
← →
xyz (2002-08-29 22:32) [21]Классно...
← →
Konrads (2002-08-30 06:25) [22]Рад что помог :)
Страницы: 1 вся ветка
Текущий архив: 2002.09.09;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.007 c