Horas por extenso: convertendo as horas em um TDateTime para texto corrido.

Publicado por rafael farias novaes 27/01/2009

[ Hits: 5.417 ]

Homepage: http://www.vivaolinux.com.br/perfil/verPerfil.php?login=bfmano

Download Horas Por Extenso, Convertendo as horas em um TDateTime para texto corrido..txt




1) Função auxiliar DecimalExtenso: ela está projetada para trabalhar com números entre 0 e 99, podendo ser ampliada para reaproveitamento em outras aplicações (extenso de valores).

O parâmetro Masculino foi introduzido para tratar questões de gênero (masc/fem), que ocorre quando se fala em horas (fem), mas não em minutos (masc). Com o intuito de otimizar recursos, um type cast deste parâmetro para o tipo Byte é utilizado. Com isto, se este parâmetro for True teremos como resultado  1 e se for False, teremos zero. Ao multiplicarmos este "resultado" por 2 (cnUnidadeGenero[Unidade +(Byte(Masculino)*2)]), estaremos indexando corretamente o vetor cnUnidadeGenero.


2) Função HoraPorExtenso: optou-se pelo parâmetro no formado TDateTime de modo a facilitar a processamento da função, bem como pela obrigação da validação do campo sendo passado no momento de sua chamada. Deste modo não há risco de excessões.

Como numa variável TDateTime/TTime (equivalente ao float) o valor das horas encontra-se na parte fracionária, multiplicando esta parte por 24 obtemos as horas. Com este processo, a "nova" parte fracionária corresponde aos minutos dentro daquela hora. Assim, multiplicando por 60, teremos o valor dos minutos.

  



Esconder código-fonte

const
  cnUnidadeGenero :array[1..4] of string   = ('uma', 'duas', 'um', 'dois');
  cnUnidade       :array[3..9] of string   = ('três', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove');
  cnDezena10      :array[11..19] of string = ('onze', 'doze', 'treze', 'quatorze', 'quinze', 'dezesseis',
                                              'dezessete', 'dezoito', 'dezenove');
  cnDezena        :array[1..9] of string   = ('dez', 'vinte', 'trinta', 'quarenta', 'cinqüenta', 'sessenta',
                                              'setanta', 'oitenta', 'noventa');

// monta apenas números decimais (até 99)
function DecimalExtenso(Num :integer; Masculino :Boolean) :string;
var
  Unidade,
  Dezena :integer;
begin
  if Num > 0 then
  begin
    Unidade := Num mod 10;
    Dezena := Num div 10;
    if Dezena = 0 then
    begin
      if Unidade <= 2 then  // Os números 1 e 2 podem variar em gênero
        Result := cnUnidadeGenero[Unidade +(Byte(Masculino)*2)]
      else
        Result := cnUnidade[Unidade]
    end else
      if Unidade = 0 then
        Result := cnDezena[Dezena]
      else
        if Dezena = 1 then
          Result := cnDezena10[Num]
        else
          if Dezena <= 9 then
            if Unidade <= 2 then  // Os números 1 e 2 podem variar em gênero
              Result := cnDezena[Dezena] + ' e ' +cnUnidadeGenero[Unidade +(Byte(Masculino)*2)]
            else
              Result := cnDezena[Dezena] + ' e ' +cnUnidade[Unidade];
  end else
    Result := 'zero';
end;

// Monta a hora por extenso.
// Pode receber um campo composto por data e hora, sem problemas
function HoraPorExtenso(Horario :TTime) :string;
var
  Hora,
  Minuto :integer;
begin
  Hora := Trunc(Frac(Horario) *24);  // Obtém Horas
  Minuto := Round(Frac(Frac(Horario) *24) *60);  // Obtém Minutos
  if Minuto = 60 then
  begin
    Inc(Hora);
    Minuto := 0;
  end;
  Result := DecimalExtenso(Hora, False) + ' hora';
  if Hora > 1 then
    Result := Result +'s';
  if Minuto > 0 then
  begin
    Result := Result +' e ' +DecimalExtenso(Minuto, True) +' minuto';
    if Minuto > 1 then
      Result := Result +'s'
  end;
end;

Scripts recomendados

Arvore Binaria de Pesquisa

Joguinho Tetris

Jogo da velha "inteligente"

Orientação a Objetos

Estrutura de dados - lista


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts