Buscar

Algarismos Romanos com barra sobre as milhares

Código

(*

Atualmente, no sistema romano-MODERNO, chama-se de vinculum a uma barra colocada em cima de um algarismo ou parte de um numeral. O algarismo ou parte de numeral por debaixo de um vinculum fica valendo mil vezes mais, e é somado ao eventual resto do algarismo.

A rotina abaixo, converte algarismos arábicos para romanos colocando esta barra utilizando o canvas do form.

Vale observar que a procedure depende da um componente do tipo TLabel para funcionar corretamente. Este TLabel será passado por parâmetro e mostrará o resultado da conversão.

*)


//Rotina para conversão de algarismos arábicos para romanos usando canvas.
//Por Márcio Rocha Dias

procedure TForm1.ArabicoParaRomano(AlgArabico: double; objSaida: Tobject);
const
  Arabicos                         : array[0..12] of Integer = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
  Romanos                          : array[0..12] of string = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
var
  i, x                             : Integer;
  bColocarMacron                   : boolean;
  Resultado                        : string;
  valor                            : string;
  Milhar                           : string;

  {Procedure responsável por desenhar o macron (traço sobre as milhares acima de 3999}

  procedure ColocarMacron(caracter: string; pColocarMacron: boolean);
  begin
    Canvas.FillRect(Rect(0, 0, 640, 480));
    Canvas.Refresh;
    if pcolocarMacron then
    begin
      TLabel(objSaida).Caption := caracter;
      Canvas.Font := TLabel(objSaida).Font;
      Canvas.Font.Size := TLabel(objSaida).Font.Size;
      Canvas.Pen.Width := 5;
      Canvas.MoveTo(TLabel(objSaida).Left + 1, TLabel(objSaida).Top - TLabel(objSaida).Height);
      Canvas.Rectangle(TLabel(objSaida).Left, TLabel(objSaida).top, TLabel(objSaida).Left + TLabel(objSaida).Width, TLabel(objSaida).top - 1);
    end;
  end;

begin
  Valor := '0';
  Resultado := '';
  bColocarMacron := false;
  if AlgArabico <= 3999999 then
  begin
    if AlgArabico > 3999 then
    begin
      valor := copy(floattostr(AlgArabico), length(floattostr(AlgArabico)) - 2, length(floattostr(AlgArabico)));
      AlgArabico := trunc(AlgArabico) div 1000;
      bColocarMacron := True;
    end;

    for x := 1 to 2 do
    begin
      if x > 1 then
      begin
        AlgArabico := StrToFloat(valor);
      end;
      for i := 12 downto 0 do
      begin
        while (AlgArabico >= Arabicos[i]) do
        begin
          AlgArabico := AlgArabico - Arabicos[i];
          Resultado := Resultado + Romanos[i];
        end;
      end;

      if x = 1 then
      begin
        Milhar := Resultado;
      end;

    end;

    ColocarMacron(Milhar, bColocarMacron);
    TLabel(objSaida).Caption := Resultado;
  end else
  begin
    showmessage('Esta rotina não é capaz de converter este número');
  end;

end;

Publicidade

Vote na dica




Quantidade de votos: 3 votos
Aceitação: 20%


Detalhes da dica

Categoria: Object pascal
Adicionada dia: 29/09/09
Por: Marcio
Visualizada: 3712 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009