Главная страницаОбратная связьКарта сайта

Сумма прописью - Способ 4

Этот алгоритм преобразует 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;


Обсудить статью на форуме


Если Вас заинтересовала или понравилась информация по разработке на Delph - "Сумма прописью - Способ 4", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу:

Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!
   


Copyright © 2008 - 2024 Дискета.info