Этот алгоритм преобразует 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
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!