14.12.2006, 12:33
общий
это ответ
Здравствуйте, Тесленко Максим Юревич!
В приложении Вы увидете код рабочего консольного приложения, которое переводит число в его строковое представление...
Так как при выводе текста на кирилице в окно консоли, то необходимо сделать преобразование кодировок таким методом:
<code>
sn:= StrAlloc(Length(st) + 1);
AnsiToOem(Pchar(st),sn);
write(sn);
StrDispose(sn);
readln;
</code>
В программе используется функция <b>GetRepresentationInWords</b>, которая и делает преобразование числа в его строковое представление (функция была взята со старого доброго <a href=http://www.delphiworld.narod.ru/dw.html><font color=purple><b>DelphiWorld</b></font></a>).
Good Luck!!!
Приложение:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
windows;
const
Mas1: array[‘0‘..‘9‘, 1..3] of string =
((‘‘, ‘‘, ‘‘),
(‘сто ‘, ‘‘, ‘один ‘),
(‘двести ‘, ‘двадцать ‘, ‘два ‘),
(‘триста ‘, ‘тридцать ‘, ‘три ‘),
(‘четыреста ‘, ‘сорок ‘, ‘четыре ‘),
(‘пятьсот ‘, ‘пятьдесят ‘, ‘пять ‘),
(‘шестьсот ‘, ‘шестьдесят ‘, ‘шесть ‘),
(‘семьсот ‘, ‘семьдесят ‘, ‘семь ‘),
(‘восемьсот ‘, ‘восемьдесят ‘, ‘восемь ‘),
(‘девятьсот ‘, ‘девяносто ‘, ‘девять ‘));
Mas2: array[‘0‘..‘9‘] of string =
(‘десять ‘, ‘одиннадцать ‘, ‘двенадцать ‘, ‘тринадцать ‘,
‘четырнадцать ‘, ‘пятнадцать ‘, ‘шестнадцать ‘, ‘семнадцать ‘,
‘восемнадцать ‘, ‘девятнадцать ‘);
Mas3: array[‘1‘..‘2‘] of string = (‘одна ‘, ‘две ‘);
Mas4: array[‘0‘..‘9‘, 1..4] of string =
((‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘),
(‘‘, ‘тысяча ‘, ‘миллион ‘, ‘миллиард ‘),
(‘‘, ‘тысячи ‘, ‘миллиона ‘, ‘миллиарда ‘),
(‘‘, ‘тысячи ‘, ‘миллиона ‘, ‘миллиарда ‘),
(‘‘, ‘тысячи ‘, ‘миллиона ‘, ‘миллиарда ‘),
(‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘),
(‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘),
(‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘),
(‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘),
(‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘));
function GetRepresentationInWords(S: string): string;
var
i: Byte;
Str: PChar;
begin
Result := ‘‘;
if S = ‘‘ then Exit;
for i := 1 to Length(S) do
if S[i] <> ‘0‘ then Break;
if i = Length(S) + 1 then
begin
Result := ‘Ноль‘;
Exit
end;
Str := @S[1];
while Length(S) mod 3 <> 0 do
Insert(‘0‘, S, 1);
for i := Length(S) div 3 downto 1 do
begin
if (Str[0] = ‘0‘) and (Str[1] = ‘0‘) and (Str[2] = ‘0‘) then
begin
Inc(Str, 3);
Continue;
end;
Result := Result + Mas1[Str[0], 1];
if Str[1] = ‘1‘ then
Result := Result + Mas2[Str[2]] + Mas4[‘0‘, i]
else
begin
Result := Result + Mas1[Str[1], 2];
if (i = 2) and (Str[2] in [‘1‘..‘2‘]) then
Result := Result + Mas3[Str[2]]
else
Result := Result + Mas1[Str[2], 3];
Result := Result + Mas4[Str[2], i];
end;
Inc(Str, 3)
end;
SetLength(Result, Length(Result) - 1)
end;
{var i:integer;}
var sn:PAnsiChar;
st:string;
begin
st:=GetRepresentationInWords(‘13‘);
sn:= StrAlloc(Length(st) + 1);
AnsiToOem(Pchar(st),sn);
write(sn);
StrDispose(sn);
readln;
end.