Вопросы и Ответы
54. Как представить число его прописным эквивалентом?
Простых путей решения этой проблемы не существует и приходится писать процедуру разбора числа. Задача сводится к разбору числа на триады (...1,234,567) начиная с конца, а уже в них происходит конечный разбор трехзначного числа и формирование его прописного эквивалента с учетом добавления "тысяч", "миллионов" и т.д.
Единственное, необходимо помнить о роде "добавки" (одна тысяча, один миллион) и разницы написания (одна тысяча, две тысячи и пять тысяч)...
Пример:
............
CONST MAX3 = 5; {Максимальное количество триад} где '0' - женский род; Это дает возможность, например,
изменяя "рубли" на "штуки" просто
поменять '1' на '0' не меняя кода.} procedure TForm1.Edit1Change(Sender: TObject); Value: LongInt; begin TRY Value := StrToInt(Edit1.Text); Memo1.Lines.Add('минус'); END IF Value = 0 THEN Memo1.Lines.Add('ноль') REPEAT {Разбивка на триады с конца} i100 := V DIV 100; i1 := V MOD 10; END i1 := V; END; 1: p := 0; END; Memo1.Lines.Insert(1, A100[i100]+A10[i10]+A11[i1]+A0[n,p]) ELSE Memo1.Lines.Insert(1, A100[i100]+A10[i10]+A1[i1]+A0[n,p]); END; UNTIL Value <= 0; EXCEPT Memo1.Clear; END end; ............
A11: ARRAY[1..2] OF STRING[20] = ('одна ', 'две ');
A1: ARRAY[0..19] OF STRING [20] = ('', 'один ', 'два ','три ', 'четыре ',
'пять ', 'шесть ', 'семь ', 'восемь ', 'девять ', 'десять
', 'одиннадцать ', 'двенадцать ', 'тринадцать ',
'четырнадцать ', 'пятнадцать ', 'шестнадцать ',
'семнадцать ', 'восемнадцать ', 'девятнадцать ');
A10: ARRAY[0..9] OF STRING [20] = ('', 'десять ', 'двадцать ',
'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ',
'семьдесят ', 'восемьдесят ', 'девяносто ');
A100: ARRAY[0..9] OF STRING[20]= ('', 'сто ', 'двести ', 'триста ',
'четыреста ', 'пятьсот ', 'шестьсот ', 'семьсот ',
'восемьсот ', 'девятьсот ');
{четвертым параметром является обозначение
мужского или женского рода,
'1' - мужской род.
A0: ARRAY[0..MAX3-1, 0..3] OF STRING[20]= (('рубль', 'рубля', 'рублей',
'1'), ('тысяча', 'тысячи', 'тысяч', '0'), ('миллион',
'миллиона', 'миллионов', '1'), ('миллиард', 'миллиарда',
'миллиардов', '1'), ('триллион', 'триллиона',
'триллионов', '1'));
VAR
i100, i10, i1: Integer;
V, p, n, i: Integer;
Memo1.Clear;
n := 0;
{Обработка отрицательного значения и нуля}
IF Value <0 THEN BEGIN
Value := -Value;
ELSE
ELSE Memo1.Lines.Add('');
V := Value MOD 1000;
Value := Value DIV 1000;
{Обработка}
IF (V > 0) OR (n = 0) THEN BEGIN
V := V-(i100*100);
IF V >= 20 THEN BEGIN
V := V DIV 10;
i10 := V MOD 10;
ELSE BEGIN
i10 := 0;
CASE i1 OF
2..4: p := 1;
ELSE p := 2;
{Изменение в зависимости от женского или
мужского рода}
IF (A0[n,3] = '0') AND ((i1 = 1) OR (i1 = 2)) THEN
Inc(n);
{Проверка выхода за максимальное количество
триад}
IF n > MAX3 THEN Exit;
Memo1.Lines.Add('Ошибка');
...предыдущая страница следующая...
оглавление