Содержание материала

 

Этот алгоритм преобразует 12345 в "двенадцать тысяч триста сорок пять". Для этого создана процедура, которая преобразует трехзначные числа в слова и прибавляет к ним "тысяч" или "миллионов". Алгоритм корректен в смысле падежей и родов. Поэтому 121000 он не переведет в "сто двадцать один тысяч".

 

 

Code:

function ShortNum(num: word; razr: integer): string;

const

hundreds: array [0..9] ofstring =

('', ' сто', ' двести', ' триста',

' четыреста', ' пятьсот', ' шестьсот', ' семьсот', ' восемьсот',

' девятьсот');

 

tens: array [0..9] ofstring =

('', '', ' двадцать', ' тридцать',

' сорок', ' пятьдесят', ' шестьдесят', ' семьдесят', ' восемьдесят',

' девяносто');

 

ones: array [3..19] ofstring =

(' три', ' четыре', ' пять', ' шесть',

' семь', ' восемь', ' девять', ' десять', ' одиннадцать',

' двенадцать', ' тринадцать', ' четырнадцать', ' пятнадцать',

' шестнадцать', ' семнадцать', ' восемнадцать', ' девятнадцать');

 

razryad: array [0..6] ofstring =

('', ' тысяч', ' миллион', ' миллиард',

' триллион', ' квадриллион', ' квинтиллион');

 

var

t: byte; // десятки

o: byte; // единицы

begin

result := hundreds[num div100];

if num = 0then

Exit;

t := (num mod100) div10;

o := num mod10;

if t <> 1then

begin

result := result + tens[t];

case o of

1:

if razr = 1then

result := result + ' одна'

else

result := result + ' один';

2:

if razr = 1then

result := result + ' две'

else

result := result + ' два';

3..9:

result := result + ones[o];

end;

result := result + razryad[razr];

case o of

1:

if razr = 1then

result := result + 'а';

2..4:

if razr = 1then

result := result + 'и'

else

if razr > 1then

result := result + 'а';

else

if razr > 1then

result := result + 'ов';

end;

end

else

begin

result := result + ones[num mod100];

result := result + razryad[razr];

if razr > 1then

result := result + 'ов';

end;

end;

 

function IntToWords(s: string): string;

var

i, count: integer;

begin

if (Length(s) <= 0) or (s = '0') then

begin

result := 'ноль';

Exit;

end;

count := (Length(s) + 2) div3;

if count > 7then

begin

result := 'Value is too large';

Exit;

end;

result := '';

s := '00' + s;

for i := 1to count do

result := ShortNum(StrToInt(copy(s, Length(s) - 3 * i + 1, 3)),

i - 1) + result;

if Length(result) > 0then

delete(result, 1, 1);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

Edit2.Text := IntToWords(Edit1.Text);

end;

 

https://delphiworld.narod.

DelphiWorld 6.0

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить