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

Вниз

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

Наверх





Память: 0.51 MB
Время: 0.008 c
14-27181
Карлсон
2002-08-11 19:25
2002.09.09
На чем пишутся ОС?


3-26901
Elena_K
2002-08-20 07:20
2002.09.09
Соединение с БД Oracle


14-27198
Fant
2002-08-14 18:02
2002.09.09
console-mouse


4-27279
Данилин Руслан
2002-07-19 14:04
2002.09.09
Отключение меню Пуск


3-26926
Guts
2002-08-19 19:47
2002.09.09
Работа с dbf без bde под Delphi 6





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский