Преобразование числа в слова |
ОГЛАВЛЕНИЕ    HOME  MAIL |
Этот алгоритм преобразует 12345 в "двенадцать тысяч триста сорок пять". Для этого создана процедура, которая преобразует трехзначные числа в слова и прибавляет к ним "тысяч" или "миллионов". Алгоритм корректен в смысле падежей и родов. Поэтому 121000 он не переведет в "сто двадцать один тысяч".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 = 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; 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) 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; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := IntToWords(Edit1.Text); end;Спасибо Евгению Толмачеву, который нашел в алгоритме несколько ошибок.
email: delphi4all@narod.ru |